リストからキーを持つ行を選択するために、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)'メソッドを認識せず、このメソッドはストア式に変換できません。
これを試して:
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」)をサポートしていません。この制限を回避するには、次のユーティリティメソッドを使用して、値のシーケンスを指定して式を手動で構築できます。
私は同じ問題を抱えていて、このように解決しました
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);
残念ながら、EFは他の人が提案したクエリを翻訳できません。そのため、これらのクエリはLINQ to Objectsでは機能しますが、LINQ to Entitiesでは機能しません。
そのため、ソリューションはもう少し複雑です。
ただし、この正確なトピックに関するブログ投稿があります here 。基本的には、小さな式ツリーマジックを使用して大きなOR式を作成します。
お役に立てれば
アレックス