2

我有一个班级的财产

Expression<Func<Product, int>> predicate;

将在整个应用程序中分配给不同的表达式。

在一个名为GetProducts我想使用实体框架从数据库中检索产品的方法中,使用这个谓词。然后,我将有一个名为的变量myInt,我想将其用作int参数,然后为其分配一个值。

所以我尝试了

dbContext.Products.Where(p => predicate(p, myInt))

但我得到了Non-invocable member 'predicate' cannot be used like a method.错误。

看起来我需要做一些表达式树操作,以创建一个新的表达式树,并myInt在其中烘焙。我怎样才能做到这一点?

谢谢您的帮助。

4

2 回答 2

2

好的,我知道了。

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

关键是Expression.Invoke可以使用提供的参数调用谓词。

编辑 - 尝试后,这只适用于 linq2sql - 实体框架无法将 InvocationExpression 转换为 SQL。相反,我使用了 LinqKit,如下所示:

dbContext.Products.AsExpandable().Where(p => predicate.Invoke(p, myInt))
于 2013-10-13T16:14:02.403 回答
2

您定义predicate为 aType但您将其用作方法。

您可以通过以下方式定义谓词:

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);
  • 命名参数时避免使用类型(即不要命名整数MyInt
于 2013-10-13T15:48:55.347 回答