在类似的情况下,我发现最好的解决方案是在数据库中进行第一次选择,然后在内存中进行完全匹配:
var parts1 = Keys.Select(k => k.Part1).ToArray();
var parts2 = Keys.Select(k => k.Part2).ToArray();
var dbSelection = context.TableRecords.Where(r => parts1.Contains(r.Part1)
&& parts2.Contains(r.Part2);
var finalSelection = from record in dbSelection
.AsEnumerable() // to memory
join key in Keys on new { record.Part1, record.Part2 }
equals
new { key.Part1, key.Part2 }
select record;
如果你有钥匙
1,2
2,1
thendbSelection
还将包含{1,1
} 和{2,2}
(但不是绝大多数其他记录)。这些被第二个查询过滤掉了。
优点是数据库查询可以利用索引,如果您使用计算键(如连接键值),这是不可能的。
缺点是你必须确保parts1
并且parts2
不能过度增长,否则SQLIN
语句会因为元素太多而变得非常低效甚至崩溃(我们在这里为Sql Server谈论数千个项目)。但对于任何使用Contains
.