5

foreach ループで述語を作成するのに問題があります。列挙子が現在オンになっている値を含む変数は、述語に入れる必要があるものです。

そう、

IQueryable query = getIQueryableSomehow();
Predicate = PredicateBuilder.False<SomeType>();
foreach (SomeOtherType t in inputEnumerable)
{
    Predicate = Predicate.Or( x => x.ListInSomeType.Contains(t) )
}
var results = query.Where(Predicate);

私を失敗させています。Predicate で一緒に ORed された式は、基本的にすべて inputEnumerable から同じ t を使用します。もちろん、Predicate に ORed された各式が inputEnumerable とは異なる t を使用するようにしたい場合です。

ループの後にデバッガーで述語を調べたところ、IL のように見えます。とにかく、そこにある各ラムダはまったく同じに見えます。

ここで私が間違っている可能性があることを誰かに教えてもらえますか?

ありがとう、

アイザック

4

2 に答える 2

5

問題は、クロージャーがどのように機能するかです。SomeOtherType t インスタンスを次のようにローカルにコピーする必要があります。

foreach (SomeOtherType t in inputEnumerable) 
{ 
    SomeOtherType localT = t;
    Predicate = Predicate.Or( x => x.ListInSomeType.Contains(localT) ) 
}

詳細については、C# のループでキャプチャされた変数を参照してください。

于 2011-10-19T02:59:21.413 に答える
1

ループ変数を閉じています。あなたのローカル変数を宣言し、SomeOtherTypeそれを述語で使用します。

foreach (SomeOtherType t in inputEnumerable)
{
    var someOtherType = t;
    Predicate = Predicate.Or( x => x.ListInSomeType.Contains(someOtherType) )
}
于 2011-10-19T02:59:31.663 に答える