EntityFramework Linq表达式中的C#动态运算符

EntityFramework Linq表达式中的C#动态运算符,c#,entity-framework,linq-expressions,C#,Entity Framework,Linq Expressions,因此,我有一个巨大的EntityFramework查询和EntityFramework,但为了保持简单,这里有一个小示例: var amount = 10; myArticles.GroupBy(p => p.Id) .Where(grp => grp.Sum(k => k.Amount) > amount 根据某些参数,我有arg1==arg2; whereClause=grp=>operatorExpression.Invoke(grp.Sum(k=>k.

因此,我有一个巨大的EntityFramework查询和EntityFramework,但为了保持简单,这里有一个小示例:

var amount = 10;

myArticles.GroupBy(p => p.Id)
    .Where(grp => grp.Sum(k => k.Amount) > amount
根据某些参数,我有
==amount

当然,我不想总是再次编写整个查询,因此我提出了以下建议:

Expression<Func<IGrouping<MyEntity, MyXy>, bool>> whereClause;
现在问题是:是否有可能通过表达式使操作符动态?我想写的是这样的:

Expression<Func<decimal, int, bool>> operatorExpression = (arg1, arg2) => arg1 == arg2;
whereClause = grp => operatorExpression.Invoke(grp.Sum(k => k.Amount), amount);
Expression操作符Expression=(arg1,arg2)=>arg1==arg2;
whereClause=grp=>operatorExpression.Invoke(grp.Sum(k=>k.Amount),Amount);

我知道有LinqKit,但我真的想知道,仅仅使用表达式树是否有可能解决这个问题,以及它有多复杂。我不想使用运算符表达式生成Func,因为结果应该在SQL Server上计算,而不是在内存中。

很遗憾,您不能
。调用
lambda表达式

从语法上讲,你可以写

grp => operatorExpression.Compile()(grp.Sum(k => k.Amount), amount)
它提供了一个表达式,其中包含所有信息,但实体框架无法理解

但通过一些表达式操作,可以将其转换为

grp => <body-of-lambda-with-parameters-replaced-by-corresponding-arguments>
grp=>
在您的示例中,lambda的主体是
arg1==arg2
,因此可以用
grp.Sum(k=>k.Amount)
替换
arg1
,用
Amount
替换
arg2


请参阅包含一些代码以执行此操作。

如果仅使用表达式树,您指的是没有自定义表达式处理帮助程序(如LINQKit或类似工具)的纯C#编译时表达式,则不可能。搜索“compose expression”,您会发现许多适用于您的简单案例的示例。您基本上是在问重新实现LINQKit有多困难。你为什么不看看它的源代码,自己决定呢?
grp => <body-of-lambda-with-parameters-replaced-by-corresponding-arguments>