W EF, jeśli mam listę primatives (lista), „łączących”, który przeciwko stół jest proste:Dołącz do listy w pamięci efektywnie
var ids = int[]{1,4,6}; //some random values
var rows = context.SomeTable.Where(r => ids.Contains(r.id))
ten staje się znacznie bardziej skomplikowany moment ty chcesz dołączyć na wielu kolumnach:
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
Znalazłem dwa sposoby, aby go dołączyć, ale nie jest wielki:
- świry w całej tabeli, a filtrowanie to bas inne dane. (To robi się powoli, jeśli stół jest naprawdę duże)
- Dla każdego klawisza, kwerendy tabeli (to dostaje powolny jeśli masz przyzwoitą liczbę wierszy do załadowania)
Czasami kompromis ja już udało się dokonać to zmodyfikowana # 1: ciągnięcie w podzbioru tabeli na podstawie dość unikalny klucz
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
}
Ale nawet to może przyhamować zbyt wiele danych.
Wiem, że istnieją sposoby, aby przekonać parametry o wartości w tabeli do ADO.Net i sposoby, jak zbudować serię klauzul .Where(), które są razem. Czy ktoś ma jakieś magiczne kule?
Aby uzyskać wydajność, użyj 'context.ExecuteQuery()' do wysłania dostosowanej instrukcji SQL. – Andomar