EF では、プリミティブのリスト (リスト) がある場合、テーブルに対して「結合」するのは簡単です。
var ids = int[]{1,4,6}; //some random values
var rows = context.SomeTable.Where(r => ids.Contains(r.id))
これは、複数の列で結合したい瞬間にはるかに複雑になります。
var keys = something.Select(s => new { s.Field1, s.Field2 })
var rows = context.SomeTable.Where(r => keys.Contains(r => new { s.Field1, s.Field2 })); // this won't work
参加する 2 つの方法を見つけましたが、どちらも素晴らしいものではありません。
- テーブル全体を吸い込み、他のデータに基づいてフィルタリングします。(テーブルが非常に大きい場合、これは遅くなります)
- キーごとにテーブルにクエリを実行します(取得する行数が適切な場合、これは遅くなります)
時々、私が作ることができた妥協は、変更された #1: かなり一意のキーに基づいてテーブルのサブセットを取得することです
var keys = something.Select(s => s.Field1)
var rows = context.SomeTable.Where(r => keys.Contains(s.Field1)).ToList();
foreach (var sRow in something)
{
var joinResult = rows.Where(r => r.Field1 == sRow.Field1 && r.Field2 == sRow.Field2);
//do stuff
}
しかし、これでもあまりにも多くのデータを引き戻す可能性があります。
テーブル値のパラメーターを ADO.Net に誘導する方法と、OR で結合された一連の .Where() 句を作成する方法があることは知っています。魔法の弾丸を持っている人はいますか?