2

クラスにプロパティがあります

Expression<Func<Product, int>> predicate;

アプリケーション全体で異なる式に割り当てられます。

というメソッドGetProductsで、この述語を使用して、Entity Framework を使用して DB から Products を取得したいと思います。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 でのみ機能します - Entity Framework では InvocationExpression を SQL に変換できません。代わりに、次のようにLinqKitを使用しました。

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

predicateとして定義しましたTypeが、メソッドとして使用しています。

次の方法で述語を定義できます。

private bool predicate(Product product, int myInt)
{
    //put your logic here
    return true;
}

ラムダ式も使用できます。

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 に答える