在 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
我找到了两种加入它的方法,但都不是很好:
- 吸入整个表,并根据其他数据对其进行过滤。(如果桌子真的很大,这会变慢)
- 对于每个键,查询表(如果您有相当数量的行要拉入,这会变慢)
有时,我能够做出的妥协是修改 #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'd 在一起的 .Where() 子句。有人有魔法子弹吗?