2009-05-22 20 views
44

Qual è l'equivalente di seguente dichiarazione in LINQ:LINQ - Dove non esiste

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) 

risposta

59

Prova questo schema Not Any.

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

vorrei fare in modo di commentare questo con un '// dove NON EXISTS' e prova a formattarlo '! db.table2.Any ...' in modo che '!' sia sulla stessa riga di 'Any'. Spesso LINQ è piuttosto auto-descrittivo, ma in questo caso penso che un commento sarebbe molto apprezzato ma gli sviluppatori futuri si imbatteranno nel tuo codice. – AaronLS

+0

@AaronLS è un'interessante domanda filosofica ... Quanto dovrebbero essere ben commentate le dimostrazioni di sintassi? Ovviamente non avevo bisogno di inserire quel commento per il beneficio del richiedente, dato che usava già il modulo sql nella domanda. –

+0

Non stavo criticando la tua risposta, stavo facendo un suggerimento generale per chiunque usi questo codice, e grazie è stato utile. – AaronLS

11

Query versione della sintassi della risposta di @ David B (con qualsiasi invertita a tutti!):

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

quanto si traduce in sql? Nella mia esperienza, "OR" deve essere evitato. –

+2

Per curiosità, che dire di "OR" lo renderebbe più pericoloso di "AND"? –

+12

OPPURE tende a interferire con l'uso di indici. Trova persone che vivono sulla 3rd street E sono idraulici ... In questo caso, un indice di persone per la strada in cui vivono è molto utile. Trova persone che vivono in 3rd street o sono idraulici ... In questo caso, un indice di persone per la strada in cui vivono è molto meno 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