2009-05-22 4 views
44

Что является эквивалентом следующего оператора в LINQ:LINQ - Где не существует

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) 

ответ

59

Попробуйте Not Any узор.

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

Я хотел бы убедиться, чтобы комментировать это с '// где НЕ EXISTS' и попробуйте отформатировать его '! db.table2.Any ...' так, чтобы '!' находился в той же строке, что и 'Any'. Часто LINQ довольно самоописательно, но это случай, я думаю, что комментарий был бы очень признателен, но будущие разработчики попадают в ваш код. – AaronLS

+0

@AaronLS это интересный философский вопрос ... Насколько хорошо прокомментированы синтаксические демонстрации? Мне явно не нужно было вставлять этот комментарий в пользу искателя, поскольку он уже использовал форму sql в вопросе. –

+0

Я не критиковал ваш ответ, я делал общее предложение для тех, кто использует этот код, и спасибо, что это было полезно. – AaronLS

11

Синтаксис запросов версия ответа @David Б (с любой перевернутой всем!):

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

Насколько хорошо это переводится в sql? По моему опыту, «ИЛИ» следует избегать. –

+2

Из любопытства, что относительно «ИЛИ» сделает его более опасным, чем «И»? –

+12

ИЛИ имеет тенденцию мешать использованию индексов. Найдите людей, которые живут на 3-й улице и являются водопроводчиками ... В этом случае индекс людей на улице, в которой они живут, очень полезен. Найдите людей, которые живут на 3-й улице или являются сантехниками ... В этом случае индекс людей по улице, на которой они живут, гораздо менее полезен. –

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 
Смежные вопросы