2009-05-22 16 views

cevap

59

bu Not Any desen deneyin. (Ile herhangi All için ters!) @ David B'nin cevabın

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

Ben bu yorum için emin kılacak bir '// nerede DEĞİL EXISTS' ve '' db.table2.Any ... '' yi biçimlendirmeye çalışın ki '' ',' Any' ile aynı satırdadır. Genellikle LINQ oldukça açık bir şekilde kendini anlatıyor, ama bu bir yorumun büyük ölçüde takdir edileceğini düşündüğüm bir durumdur, ancak gelecekteki kodlar kodunuza rastlar. – AaronLS

+0

@AaronLS bu ilginç bir felsefi soru ... Ne kadar iyi yorumlanması sözdizimi göstermeli? Sorgudaki sql formunu zaten kullandığı için, bu yorumu askerden yararlanma konusunda açıkça belirtmem gerekiyordu. –

+0

Cevabınızı eleştirmedim, bu kodu kullanan herkes için genel bir öneride bulundum ve bu yararlı oldu. – AaronLS

11

Sorgu sözdizimi sürümü:

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

bu, sql'ye ne kadar iyi çevirir? Benim tecrübemde "VEYA" kaçınılmalıdır. –

+2

Merak etme, "VEYA" ile ilgili, "VE" den daha tehlikeli hale ne gelir? –

+12

VEYA dizinlerin kullanımına müdahale etme eğilimi gösterir. 3. caddede yaşayan insanları bulun VE su tesisatçıları ... Bu durumda, yaşadıkları caddede bir insan indeksi oldukça faydalıdır. 3. caddede yaşayan insanları bul YA DA su tesisatçıları ... Bu durumda, yaşadıkları caddeye göre bir insan indeksi çok daha az faydalıdır. –

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