Компиляторы так умны, как мы делаем их. Я не знаю слишком много программистов, которые потрудились бы писать компилятор, который проверит на конструкции, такие как те, Вы использовали. Большая часть концентрата на более типичных способах улучшить производительность.
возможно, что когда-нибудь у нас будет программное обеспечение, включая компиляторы, которые могут на самом деле учиться и вырасти. Когда в тот день прибудет больше всего, возможно, все, программисты будут без работы.
Сделайте следующее:
IQueryable<Enquiry> query = Context.EnquirySet;
query = (from e in query
where (!e.Applications.Any())
|| e.Applications.Any(app => app.Status != 4)
select e);
Я вообще не считаю, что LINQ решает проблему «внешнего соединения» в SQL «глупо». Ключ к пониманию этого - думать в терминах графа объектов со свойствами, допускающими значение NULL, а не в виде табличного набора результатов.
Any () сопоставляется с EXISTS в SQL, поэтому он намного эффективнее, чем Count ( ) в некоторых случаях.
Спасибо, ребята, за вашу помощь. В конце концов, я выбрал этот вариант, но ваши решения помогли расширить мои знания.
IQueryable<Enquiry> query = Context.EnquirySet;
query = query.Except(from e in query
from a in e.Applications
where a.Status == 4
select e);
Из-за глупого (читай нестандартного) способа Linq работы с внешними объектами вы должны использовать DefaultIfEmpty ().
Вам нужно выполнить запрос Linq-To-Entities. на два IEnumerables, затем ВЛЕВО. Соедините их с помощью DefaultIfEmpty (). Это может выглядеть примерно так:
IQueryable enq = Enquiry.Select();
IQueryable app = Application.Select();
var x = from e in enq
join a in app on e.enquiryid equals a.enquiryid
into ae
where e.Status != 4
from appEnq in ae.DefaultIfEmpty()
select e.*;
Тот факт, что вы не можете сделать это с помощью Linq-To-Entities, не означает, что вы не можете сделать это с помощью простого Linq.
(Примечание: прежде чем кто-нибудь проголосует против меня ... да, я знаю, что есть более элегантные способы сделать это. Я просто пытаюсь сделать это понятным. Важна концепция, верно?)