2009-05-22 9 views
44

Quel est l'équivalent de la déclaration suivante dans LINQ:LINQ - Où existe pas

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) 

Répondre

59

Essayez ce modèle Not Any.

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

Je veillerais de commenter cela avec un '// où ne pas EXISTS' et essayez de le formater '! db.table2.Any ...' de sorte que '!' soit sur la même ligne que 'Any'. Souvent, LINQ est assez auto-descriptif, mais c'est un cas, je pense qu'un commentaire serait grandement apprécié, mais les futurs développeurs venant à travers votre code. – AaronLS

+0

@AaronLS c'est une question philosophique intéressante ... Comment les démonstrations de syntaxe devraient-elles être commentées? Je n'avais évidemment pas besoin de mettre ce commentaire en avant pour le demandeur, car il utilisait déjà le formulaire sql dans la question. –

+0

Je ne critiquais pas votre réponse, je faisais une suggestion générale pour quiconque utilise ce code, et merci, c'était utile. – AaronLS

11

version Query syntaxe de la réponse de @ David B (avec Tout inversé à tous!):

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

comment cela se traduit-il en sql? Dans mon expérience, "OU" doit être évité. –

+2

Par curiosité, que diriez-vous de "OU" le rendrait plus dangereux que "ET"? –

+12

OU tend à interférer avec l'utilisation des index. Trouvez des gens qui vivent sur la 3ème rue ET qui sont plombiers ... Dans ce cas, un index des gens par la rue où ils vivent est très utile. Trouvez des gens qui vivent dans la 3e rue OU qui sont plombiers ... Dans ce cas, un index des gens par la rue où ils vivent est beaucoup moins utile. –

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