2009-05-22 16 views
44

Cuál es el equivalente de la siguiente declaración en LINQ:LINQ - Cuando no existe

Select t1.appname, t1.julianDte, t1.cat 
From table1 t1 
Where NOT EXISTS 
    (Select * 
    from table t2 
    where t1.cat = t2.cat AND t2.julianDte < t1.julianDte) 

Respuesta

59

Prueba este patrón Not Any.

var query = db.table1 
.Where(t1 => !db.table2 
    .Any(t2 => t2.cat == t1.cat && t2.julianDte < t1.julianDte) 
); 
+0

me aseguraría de comentar esto con un '// donde NO EXISTS' y intente formatearlo '! db.table2.Any ...' de modo que '!' esté en la misma línea que 'Any'. A menudo, LINQ es bastante autodescriptivo, pero este es un caso, creo que un comentario sería muy apreciado, pero los desarrolladores venían a través de su código. – AaronLS

+0

@AaronLS es una pregunta filosófica interesante ... ¿Qué tan bien comentado deberían ser las demostraciones de sintaxis? Claramente no necesité poner ese comentario para el beneficio del asker, ya que él ya usó el formulario sql en la pregunta. –

+0

No estaba criticando su respuesta, estaba haciendo una sugerencia general para cualquiera que use este código, y gracias fue útil. – AaronLS

11

Query versión sintaxis de la respuesta de @ David B (con cualquier invierte para todos!):

from t1 in db.Table1 
where db.Table2.All(t2 => t1.cat != t2.cat || t2.julianDte >= t1.julianDte) 
select new 
{ 
    t1.appname, 
    t1.julianDte, 
    t1.cat 
}; 
+0

¿qué tan bien se traduce eso en sql? En mi experiencia, "O" debe ser evitado. –

+2

Por curiosidad, ¿qué tal "O" lo haría más peligroso que "Y"? –

+12

O tiende a interferir con el uso de índices. Encuentra personas que viven en la calle 3 Y son fontaneros ... En este caso, es muy útil un índice de personas por la calle donde viven. Encuentra personas que viven en la calle 3 O SON plomeros ... En este caso, un índice de personas por la calle donde viven es mucho menos útil. –

1
from t1 in Context.table1DbSet 
let ok = 
    (from t2 in Context.table2DbSet 
    where t2.Idt1 = t1.Idt1 && t1.DateValid.HasValue 
    ).Any() 
where 
    t1.Active 
    && !ok 
Cuestiones relacionadas