2009-07-20 2 views
1

Я не смог преобразовать этот SQL запрос в рабочем Linq заявлениеLinq запрос с левым присоединиться и группа

select sum(cena), id_auta, max(servis) from dt_poruchy left outer join mt_auta on dt_poruchy.id_auta=mt_auta.id
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 { 

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

ответ

1

Я достиг этого решения (предположим, "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

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

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

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

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

Вот хорошая ссылка для вас.

2

на основе ограниченной информации (таблицы, которые некоторые поля из?), Вот что я придумал.

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) 
      }; 
+0

Сообщите мне, если я сделал какие-либо неправильные предположения, и я обязательно уточню свой ответ! –

+0

Прошу прощения за мое определение неспособности. MtAuta - это главная таблица (содержащая DtPoruchy), а DtPoruchy - таблица подчиненных, содержащая поля CENA, SERVIS и ID_AUTA. – user137348

+0

Помимо капитализации в моем ответе, это работает для вас? Вы используете LinqToSql, и если да, настроены ли ваши отношения правильно? Это оказалось так, что в вашем вопросе у вас была «p.MtAuta», но было бы хорошо подтвердить. –

0

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

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) 
        }; 

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

+0

Вряд ли вам что-то понадобится удаленно. из ответа Райана. –

Смежные вопросы