C# 创建调用表达式树的表达式树
我有一个类的属性C# 创建调用表达式树的表达式树,c#,entity-framework,C#,Entity Framework,我有一个类的属性 Expression<Func<Product, int>> predicate; 但我发现非可开票成员“predicate”不能像方法一样使用。错误 看起来我需要做一些表达式树操作,以创建一个新的表达式树,其中包含myInt烘焙。我该怎么做 谢谢您的帮助。您将谓词定义为类型,但您将其用作方法 可以按以下方式定义谓词: private bool predicate(Product product, int myInt) { //put your
Expression<Func<Product, int>> predicate;
但我发现非可开票成员“predicate”不能像方法一样使用。
错误
看起来我需要做一些表达式树操作,以创建一个新的表达式树,其中包含myInt
烘焙。我该怎么做
谢谢您的帮助。您将
谓词定义为类型
,但您将其用作方法
可以按以下方式定义谓词:
private bool predicate(Product product, int myInt)
{
//put your logic here
return true;
}
也可以使用lambda表达式:
product => product.SomeValue > 5
编辑:
Expression<Func<Product, int>> predicate = (product,val) => product.SomeValue > val;
var filtered = dbContext.Products.Where(predicate);
表达式谓词=(product,val)=>product.SomeValue>val;
var filtered=dbContext.Products.Where(谓词);
- 在命名参数时避免使用类型(即不要命名整数
MyInt
)
好的,明白了
ParameterExpression prm = Expression.Parameter(typeof(Product));
InvocationExpression inv = Expression.Invoke(predicate, prm, Expression.Constant(myInt));
var lambda = (Expression<Func<Product,bool>>) Expression.Lambda(inv, prm);
dbContext.Products.Where(lambda);
这将不起作用,因为它不是一个表达式,实体框架将无法将该方法转换为SQL。Lambda不起作用,因为分配属性的子类无权访问myInt。我不想硬编码5!当谓词被创建时,无法知道myInt将是什么…谓词被分配到哪里,就无法访问myInt。请看我的答案-我怀疑是否有更简单的方法。您是否尝试过dbContext.Products.Where(谓词)
?不能像调用委托一样调用表达式。此外,签名是错误的;这只需要一个论点。(要将表达式
转换为委托调用Compile()
)@JeppeStigNielsen我不能使用谓词,因为签名是错误的。我需要用正确的签名创建一个新的表达式来包装谓词,从而得到问题的标题。不能使用编译,因为实体框架只接受未编译的表达式。啊,我现在明白了。我应该仔细阅读你的问题。
ParameterExpression prm = Expression.Parameter(typeof(Product));
InvocationExpression inv = Expression.Invoke(predicate, prm, Expression.Constant(myInt));
var lambda = (Expression<Func<Product,bool>>) Expression.Lambda(inv, prm);
dbContext.Products.Where(lambda);
dbContext.Products.AsExpandable().Where(p => predicate.Invoke(p, myInt))