Linq-запрос с левым соединением и группой - PullRequest
1 голос
/ 20 июля 2009

Я не могу преобразовать этот SQL-запрос в рабочий оператор linq

select sum(cena), id_auta, max(servis) from dt_poruchy left outer join mt_auta on dt_poruchy.id_auta=mt_auta.id<br> where dt_poruchy.servis>=3 group by id_auta;

Я пробовал что-то подобное, но я не могу обработать оператор выбора

   var auta = from a in MtAuta.FindAll()
                   join p in DtPoruchy.FindAll() on a equals p.MtAuta into ap
                   from ap2 in ap.DefaultIfEmpty()
                   where ap2.SERVIS >= 3
                   group ap2 by ap2.ID into grouped
                   select new {

Буду признателен за любую помощь!

Ответы [ 4 ]

2 голосов
/ 20 июля 2009

На основании предоставленной ограниченной информации (из каких таблиц являются определенными полями?) Я пришел к следующему.

var auta = from a in MtAuta.FindAll()
           let p = a.DtPoruchys.Where(s => s.SERVIS >= 3)
           select new
           {
               Id = a.Id,
               CenaSum = p.Sum(c => c.Cena),
               Servis = p.Max(s => s.SERVIS)
           };
1 голос
/ 20 июля 2009

Я достиг этого решения (предположим, что "cena" принадлежит MtAuta.FindAll()):

        var auta = from e in
                       (from a in DtPoruchy.FindAll()
                        where a.SERVIS >= 3
                        join p in MtAuta.FindAll() on a.MtAuta equals p.Id into ap
                        from ap2 in ap.DefaultIfEmpty()
                        select new
                        {
                            Cena = ap.cena,
                            IdAuta = a.MtAuta,
                            Servis = a.servis
                        })
                   group e by e.IdAuta into g
                   select new
                   {
                       Cena = g.Sum(e => e.cena),
                       IdAuta = g.Key,
                       Servis = g.Max(e => e.servis)
                   };
1 голос
/ 20 июля 2009

Я не уверен, из каких таблиц cena и servis происходят, но для создания сгруппированной суммы вы делаете что-то вроде.

select new { Sum = grouped.Sum( x => x.cena ) }

и получить максимум

select new { Max = grouped.Group.Max( x => x.servis ) }

Вот хороший справочник для вас.

0 голосов
/ 20 июля 2009

Я немного изменил ваше решение и у меня получилось так:

var auta = from jo in
                       (
                           from a in MtAuta.FindAll()
                           join p in DtPoruchy.FindAll() on a equals p.MtAuta into ap
                           from ap2 in ap.DefaultIfEmpty()
                           where ap2.SERVIS >= 3
                           select new
                           {
                               Cena = ap2.CENA,
                               Idauto = ap2.ID_AUTA,
                               Servis = ap2.SERVIS
                           }
                       )
                   group jo by jo.Idauto into g
                   select new
                   {
                       Cena = g.Sum(jo => jo.Cena),
                       IdAuto = g.Key,
                       Servis = g.Max(jo => jo.Servis)
                   };

Мне просто интересно, это лучшее решение?

...