在類似情況下,我已經找到了最佳的解決方案是在其中的第一選擇完成在數據庫中,然後是精確匹配的內存:
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
然後dbSelection
也將包含{1,1
}和{2,2}
(但絕大多數其他記錄)。這些被第二個查詢過濾掉。
優點是數據庫查詢可以利用索引,如果您使用計算鍵(如連接的鍵值),這是不可能的。
的缺點是,你必須確保parts1
和parts2
不能生長過度,否則SQL語句IN
將變得非常低效甚至因爲太多的元素的崩潰(我們談論項目的成千上萬在這裏爲SQL服務器)。但對於使用Contains
的任何解決方案,情況都是如此。
這可能會有巨大的缺點,因爲查詢不會在服務器端進行評估。 – Alwyn
@Alwyn沒有。這是該解決方案的「優點」。 –
聽起來不錯,但是這可以索引? – Alwyn