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 甚至不知道它在那里。