2011-07-12 12 views

Respuesta

19

Usted necesita DefaultIfEmpty() para la LEFT JOIN, a continuación, se puede comprobar si el valor sumado es 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

Más fácil sería escribir así:

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

es su instrucción SQL como optimizada como la respuesta de dahlbyk? –

+0

Tendrá un rendimiento aún mejor. Generará 'NOT EXISTS' en código SQL. – Magnus

+0

Estrictamente hablando, el rendimiento de 'NOT EXISTS' vs' LEFT JOIN' depende de la estructura de la base de datos en cuestión - verifique los planes de ejecución para estar seguro. En LINQ to Objects, la combinación tendría un mejor rendimiento porque crea una búsqueda de 'Table_B' una vez en lugar de explorar la tabla para cada' Any() '- un motor SQL podría razonablemente usar una implementación similar. – dahlbyk

1

Una manera aún más rápida

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