Linq к объектам Оставленное Соединение

Компиляторы так умны, как мы делаем их. Я не знаю слишком много программистов, которые потрудились бы писать компилятор, который проверит на конструкции, такие как те, Вы использовали. Большая часть концентрата на более типичных способах улучшить производительность.

возможно, что когда-нибудь у нас будет программное обеспечение, включая компиляторы, которые могут на самом деле учиться и вырасти. Когда в тот день прибудет больше всего, возможно, все, программисты будут без работы.

5
задан Mark 1 October 2009 в 14:23
поделиться

3 ответа

Сделайте следующее:

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 ( ) в некоторых случаях.

6
ответ дан 18 December 2019 в 07:30
поделиться

Спасибо, ребята, за вашу помощь. В конце концов, я выбрал этот вариант, но ваши решения помогли расширить мои знания.

IQueryable<Enquiry> query = Context.EnquirySet;

query = query.Except(from e in query
                     from a in e.Applications
                     where a.Status == 4
                     select e);
3
ответ дан 18 December 2019 в 07:30
поделиться

Из-за глупого (читай нестандартного) способа 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.

(Примечание: прежде чем кто-нибудь проголосует против меня ... да, я знаю, что есть более элегантные способы сделать это. Я просто пытаюсь сделать это понятным. Важна концепция, верно?)

1
ответ дан 18 December 2019 в 07:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: