web-dev-qa-db-ja.com

エンティティフレームワークで「in」クエリを実行するにはどうすればよいですか?

リストからキーを持つ行を選択するために、linqでエンティティを選択するにはどうすればよいですか?このようなもの:

var orderKeys = new int[] { 1, 12, 306, 284, 50047};
var orders = (from order in context.Orders 
              where (order.Key in orderKeys) 
              select order).ToList();
Assert.AreEqual(orderKeys.Count, orders.Count);

私はContainsメソッドをいくつかの回答で述べたように使用しようとしましたが、機能せず、この例外をスローします:

LINQ to Entitiesはメソッド 'Boolean Contains [Int32](System.Collections.Generic.IEnumerable`1 [System.Int32]、Int32)'メソッドを認識せず、このメソッドはストア式に変換できません。

49
NotDan

これを試して:

var orderKeys = new int[] { 1, 12, 306, 284, 50047};
var orders = (from order in context.Orders 
              where orderKeys.Contains(order.Key);
              select order).ToList();
Assert.AreEqual(orderKeys.Count, orders.Count);

編集:この問題の回避策を見つけました- WHERE IN句? をご覧ください:

Entity Frameworkは現在、コレクション値パラメーター(この例では「statusesToFind」)をサポートしていません。この制限を回避するには、次のユーティリティメソッドを使用して、値のシーケンスを指定して式を手動で構築できます。

42
Andrew Hare

私は同じ問題を抱えていて、このように解決しました

var orderKeys = new int[] { 1, 12, 306, 284, 50047};
var orders = (from order in context.Orders 
              where (orderKeys.Contains(order.Key)) 
              select order).ToList();
Assert.AreEqual(orderKeys.Count, orders.Count);
21
eka808

残念ながら、EFは他の人が提案したクエリを翻訳できません。そのため、これらのクエリはLINQ to Objectsでは機能しますが、LINQ to Entitiesでは機能しません。

そのため、ソリューションはもう少し複雑です。

ただし、この正確なトピックに関するブログ投稿があります here 。基本的には、小さな式ツリーマジックを使用して大きなOR式を作成します。

お役に立てれば

アレックス

8
Alex James