2009-08-31 12 views
2

私はLinqとEntity Frameworkを使用しています。私はページエンティティを持っています。これは、タグエンティティと多対多の関係を持っています。変数付きLinq式の構築

提供されたすべてのタグに一致するすべてのページを取得するLinqクエリを作成したいとします(Int64 [])。

さまざまなWhereInおよびBuildContainsExpressionの例を試しましたが、期待どおりに動作していません。

私は今、タグのそれぞれをループしようと式のリストを構築しています:

foreach (Int64 item in Tags) 
{ 
    Expression<Func<Pages, bool>> tagFilter = c => c.Tags.Any(x => x.TagID == item); 
    exp.Add(tagFilter); 
} 

はしかし、私はそれがいずれかを使用しているいずれかのため、ローカル変数「項目」は、クエリをいじりいると思いますクエリが実行されるタグ、またはそれらのどれもが、しかし、私はこのようにそれらを指定した場合:

Expression<Func<Pages, bool>> tagFilter1 = c1 => c1.Tags.Any(x => x.TagID == 70); 
exp.Add(tagFilter1); 
Expression<Func<Pages, bool>> tagFilter2 = c1 => c1.Tags.Any(x => x.TagID == 130); 
exp.Add(tagFilter2); 
Expression<Func<Pages, bool>> tagFilter3 = c1 => c1.Tags.Any(x => x.TagID == 77); 
exp.Add(tagFilter3); 

実際の数は「70」とは、例えば、それは魔法のように動作を使用します。私は基本的にリストに式を格納して、And()にLinqKitを使用しています。

この動的な状態を維持する方法はありますか?

答えて

4
にコードを変更し

:詳細な説明、read my answer to the "What is the exact definition of a closure?" questionについて

foreach (Int64 item in Tags) 
{ 
    var temp = item; // this variable is scoped **inside** the loop. 
    Expression<Func<Pages, bool>> tagFilter = c => c.Tags.Any(x => x.TagID == temp); 
    exp.Add(tagFilter); 
} 

+0

lambdaを使って作業するときは、誰もが少なくともこの問題に遭遇するようです。実際には、変数をforeach/lambdaで直接使用するコンパイラ警告を作成する必要があります。 – bobbymcr

+0

ありがとうございました! –

関連する問題