Jak osiągnąć Left Wyłączając JOIN używając LINQ?Jak osiągnąć Left Wyłączając JOIN używając LINQ?
W SQL:
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL
Jak osiągnąć Left Wyłączając JOIN używając LINQ?Jak osiągnąć Left Wyłączając JOIN używając LINQ?
W SQL:
SELECT <select_list>
FROM Table_A A
LEFT JOIN Table_B B
ON A.Key = B.Key
WHERE B.Key IS NULL
Trzeba DefaultIfEmpty()
dla LEFT JOIN
, można sprawdzić, czy dołączył wartość null
:
var result = from a in Table_A
join b in Table_B on a.Key equals b.Key into j
from b in j.DefaultIfEmpty()
where b == null
select new { ... };
Łatwiej byłoby napisać tak:
var result = from a in Table_A
where !Table_B.Any(b => b.Key == a.key)
select new { ... };
Jeszcze szybszy sposób
var result = from a in Table_A
where !Table_B.Select(b => b.Key).Contains(a.Key)
select new { ... };
Czy jego instrukcja SQL jest zoptymalizowana pod kątem odpowiedzi dahlbyka? –
To będzie miało jeszcze lepszą wydajność. Wygeneruje 'NOT EXISTS' w kodzie SQL. – Magnus
Ściśle mówiąc, wydajność 'NOT EXISTS' vs' LEFT JOIN' zależy od struktury danej bazy danych - sprawdź plany wykonania, aby mieć pewność. W LINQ to Objects, sprzężenie byłoby lepsze, ponieważ buduje Lookup 'Table_B', zamiast skanować tabelę dla każdego' Any() '- silnik SQL może rozsądnie korzystać z podobnej implementacji. – dahlbyk