C# LINQ to实体中聚合函数的表达式树

C# LINQ to实体中聚合函数的表达式树,c#,linq,entity-framework,linq-to-entities,aggregate-functions,C#,Linq,Entity Framework,Linq To Entities,Aggregate Functions,我需要在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 {

我需要在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)
        };
IQueryable orders=ordersepository.GetAll();
var q=从订单中的o开始
按o.OrderDate将o分组为g
选择新的
{
OrderDate=g.键,
AggregatedAmount=g.AsQueryable()
.平均值(x=>x.金额)
};
我一直在将
Queryable.Average()
转换成一个表达式树,该表达式树可以放在查询中,并可以成功地转换为SQL。

g.Average(x=>x.Amount)
Queryable.Average(g,x=>x.Amount)
。我们想替换
可查询的.Average
部分。就像这样:

Expression<Func<IQueryable<Order>, Func<Order, double>>> aggregate = ...;
问题是不能调用表达式。因此,请使用:


这将
aggregate
内联到查询表达式中,以便EF甚至不知道它在那里。

您能提供到目前为止尝试的更多详细信息吗?有一个小的库,允许您在查询中插入任意表达式。我现在记不起它的名字了。@usr:这是我的问题。我不知道如何接近,从哪里开始。毫无疑问,谷歌充满了where子句的谓词构建器。但是似乎没有人尝试编写选择器。嗯,你确定我需要调用
Complle()()
?我遇到一个错误:无法将类型为
System.Linq.Expressions.InstanceMethodCallExpressionN
的对象强制转换为类型
System.Linq.Expressions.LambdaExpression
。这些没有多大帮助:或者我只是忽略了.Hm。它只适用于
IQueryable
,但不适用于
IGroupping
。(我希望)好的,如果有任何问题,它只能是一个可扩展的代码。您交给EF的表达式应该与手动编写的代码无法区分。也许你需要深入研究一个可扩展的。我不认为它有什么复杂的作用。它应该只是将表达式中的“粘贴”到树中。基本上将a.Compile().Invoke(x)转换为a(x)。
AggregatedAmount = aggregate(g, x => x.Amount)
var q = from o in orders.AsExpandable()
...
AggregatedAmount = aggregate.Compile()(g, x => x.Amount)