Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建调用表达式树的表达式树_C#_Entity Framework - Fatal编程技术网

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))