LINQ to Entities 中聚合函数的表达式树
Expression Tree for Aggregate Function in LINQ to Entities
我需要在 LINQ to Entities 查询之上动态替换聚合函数以在数据库中执行操作,同时不要硬编码我使用的函数,例如在这样的查询中将 Average()
替换为 Max()
或 Min()
:
IQueryable<Order> orders = ordersRepository.GetAll();
var q = from o in orders
group o by o.OrderDate into g
select new
{
OrderDate = g.Key,
AggregatedAmount = g.AsQueryable()
.Average(x => x.Amount)
};
我坚持要将 Queryable.Average()
翻译成可以放入查询中的表达式树,并成功翻译成 SQL。
g.Average(x => x.Amount)
是 Queryable.Average(g, x => x.Amount)
。我们要替换 Queryable.Average
部分。像这样:
Expression<Func<IQueryable<Order>, Func<Order, double>>> aggregate = ...;
然后使用表达式:
AggregatedAmount = aggregate(g, x => x.Amount)
问题是不能调用表达式。所以使用 AsExpandable
:
var q = from o in orders.AsExpandable()
...
AggregatedAmount = aggregate.Compile()(g, x => x.Amount)
这会将 aggregate
内联到查询表达式中,这样 EF 甚至不知道它在那里。
我需要在 LINQ to Entities 查询之上动态替换聚合函数以在数据库中执行操作,同时不要硬编码我使用的函数,例如在这样的查询中将 Average()
替换为 Max()
或 Min()
:
IQueryable<Order> orders = ordersRepository.GetAll();
var q = from o in orders
group o by o.OrderDate into g
select new
{
OrderDate = g.Key,
AggregatedAmount = g.AsQueryable()
.Average(x => x.Amount)
};
我坚持要将 Queryable.Average()
翻译成可以放入查询中的表达式树,并成功翻译成 SQL。
g.Average(x => x.Amount)
是 Queryable.Average(g, x => x.Amount)
。我们要替换 Queryable.Average
部分。像这样:
Expression<Func<IQueryable<Order>, Func<Order, double>>> aggregate = ...;
然后使用表达式:
AggregatedAmount = aggregate(g, x => x.Amount)
问题是不能调用表达式。所以使用 AsExpandable
:
var q = from o in orders.AsExpandable()
...
AggregatedAmount = aggregate.Compile()(g, x => x.Amount)
这会将 aggregate
内联到查询表达式中,这样 EF 甚至不知道它在那里。