2011-07-12 18 views

Odpowiedz

19

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 { ... }; 
12

Łatwiej byłoby napisać tak:

var result = from a in Table_A 
      where !Table_B.Any(b => b.Key == a.key) 
      select new { ... }; 
+0

Czy jego instrukcja SQL jest zoptymalizowana pod kątem odpowiedzi dahlbyka? –

+0

To będzie miało jeszcze lepszą wydajność. Wygeneruje 'NOT EXISTS' w kodzie SQL. – Magnus

+0

Ś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

1

Jeszcze szybszy sposób

var result = from a in Table_A 
    where !Table_B.Select(b => b.Key).Contains(a.Key) 
    select new { ... };