2

「Things」というテーブルから選択するためにいくつかの条件を適用する必要があるとしましょう (不明なカウントと性質)

条件がわかっている場合は、次のように記述できます

db.Things.Where(t=>foo1 && foo2 || foo3);

しかし、その Where 条件をプログラムで作成する必要がある場合、AND 条件を適用する方法を想像できます。

IQuerable DesiredThings = db.Things.AsQuerable();
foreach (Condition c in AndedConditions)
DesiredThings = DesiredThings.Where(t => GenerateCondition(c,t));

ORed条件はどうですか?注: 結合、一意、またはその他のコストのかかる操作は実行したくありません。アドホックに記述したかのようにクエリが生成されることが望まれます。

前もって感謝します。


添加:

PredicateBuilder:式の述語を動的に構成する

4

2 に答える 2

5

静的メソッドでExpressionクラスを使用して、実行時に実行できます。

以下のコードは、int型の値と呼ばれる1つの引数を取るデリゲートを作成するためのコードです。それは下から上に読むので、問題の行は次のとおりです。

var method = LambdaExpression.Lambda(orExp, Expression.Parameter(typeof(int), "value"));

メソッドの本体は、パラメーターの値を、foo型の新しく作成されたオブジェクトのメソッドBarの呼び出しと比較します。

var exp2 = Expression.Equal(Expression.Parameter(typeof(int), "value"), Expression.Property(Expression.New(typeof(Foo).GetConstructor(new Type[] { })), "Bar"));

次に、同様の式を作成します。

        var orExp = Expression.OrElse(exp1, exp2);

最後に、コンパイルの呼び出しです。その呼び出しは、whereメソッド呼び出しで使用できるデリゲートを生成します。

式がパラメータから値を取得するのに100%確実ではないことが役立つことを願っています

var exp1 = Expression.Equal(Expression.Parameter(typeof(int),"value"), Expression.Property(Expression.New(typeof(Bar).GetConstructor(new Type[] { })), "Foo"));
            var exp2 = Expression.Equal(Expression.Parameter(typeof(int), "value"), Expression.Property(Expression.New(typeof(Foo).GetConstructor(new Type[] { })), "Bar"));
            var orExp = Expression.OrElse(exp1, exp2);
            var method = LambdaExpression.Lambda(orExp, Expression.Parameter(typeof(int), "value"));
            method.Compile();

LambdaExpressionをバイナリコードとは異なるものに変換する必要がある場合(SQLステートメントなど)、式をコンパイルする代わりに、invokeforinvokationを検討することをお勧めします。

于 2009-09-20T18:29:00.417 に答える
3

の場合OR、2つの選択肢があります。

  • 使用Union/Concat
  • Expressionコードを書く

2番目はに近い.Where(x => {a} || {b})です。

LINQ-to-SQLを使用している場合はExpression.Invoke、複数の個別のラムダ式を組み合わせるために使用できます(この回答を参照)。ただし、これはEntityFrameworkではサポートされていません。Expression.OrElseEFでは、 ;を使用して、式全体を1つのブロックとして作成する必要があります。たとえば、ここまたはここ

于 2009-09-20T18:28:00.203 に答える