2011-10-03 5 views
6

で使用する辞書:それは作品リストを持つ一方でLINQ:私は、クエリ

Dictionary<int, List<int>> dict = new ... 
var a = SomeEntity.Where(f => dict[f.key].Contains(f.someValue)) 

これはエラー

LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[System.Int32] get_Item(Int32)' method 

を生成します私は何かが欠けていますか?

答えて

10

エンティティフレームワークの性質 - クエリに式を挿入すると、サーバーで作業を実行できるように、式をSQLに変換するのが最善です。

最初の例では、クエリと辞書の検​​索呼び出しの両方をSQLに変換しようとしますが、これは方法がわからないため実行できません。

2番目の例では、クエリにリストを渡すだけです。これをSQLに変換する方法はわかっています。

EFクエリを定義する前に、それに気をつけておく必要があります。

EDITちょうど辞書からの読み取り時に、あなたの最初のクエリは、クエリの結果を利用していることに気づきました。

Dictionary<int, List<int>> dict = new ... 
var a = SomeEntity 
    .ToArray() 
    .Where(f => dict[f.key].Contains(f.someValue)); 
:あなたが実際にSQLクエリにあなたの辞書を渡すことはできませんので、だから、あなたはおそらく最初のDBからすべてのレコードを取得する必要があります、そして同じように、あなたのチェックを実行するためにLINQツーオブジェクトを使用します

ToArray()メソッドは、結果セット全体をメモリにプルします(他の方法もありますが、これは通常の方法です)。そして、次のWhere句は、LINQ-to-EntitiesではなくLINQ-あなたの辞書のコードがうまく動作することを意味します。

+0

非常に明確な答え、ありがとう – ren