2015-06-06 2 views
-2

У меня есть 5 столов:GroupBy с SingleOrDefault в EF

NazelShifts

Nazel

Tank

PersonnelNazelShifts

Сдвиг

SQL запрос:

SELECT  SUM(NazelShift.Eold) AS tEold, SUM(NazelShift.Er) AS tEr,  SUM(NazelShift.Ecf) AS tEcf, SUM(NazelShift.Esf) AS tEsf, SUM(NazelShift.ESale) AS tESale, Tank.FuelId, 
         NazelShift.ShiftId, PersonnelNazelShift.PersonnelId 
FROM  NazelShift INNER JOIN 
         Nazel ON NazelShift.NazelId = Nazel.NazelId AND NazelShift.NazelId = Nazel.NazelId INNER JOIN 
         Tank ON Nazel.TankId = Tank.TankId INNER JOIN 
         PersonnelNazelShift ON Nazel.NazelId = PersonnelNazelShift.NazelId INNER JOIN 
         Shift ON NazelShift.ShiftId = Shift.ShiftId AND PersonnelNazelShift.ShiftId = Shift.ShiftId 
WHERE  (NazelShift.ShiftId = 1) 
GROUP BY Tank.FuelId, NazelShift.ShiftId, PersonnelNazelShift.PersonnelId 

NazelShift имеют pelation много к одному с Nazel и сдвиг также PersonnelNazelShift имеют отношение многие к одному с Nazel и Shift.

диаграмма http://jmp.sh/dlO3MTf

мне нужно запустить этот запрос:

NazelShifts.Where(i => i.ShiftId == 1) 
    .GroupBy(i => new 
    { 
     i.ShiftId,   
     i.Nazel.Tank.FuelId, 
     i.Nazel.PersonnelNazelShifts.SingleOrDefault().PersonnelId 
    }) 
    .Select(i => new 
    { 
     i.Key.ShiftId, 
     i.Key.PersonnelId, 
     i.Key.FuelId, 
     tEold = i.Sum(rr => rr.Eold), 
     tEr = i.Sum(rr => rr.Er), 
     tEcf = i.Sum(rr => rr.Ecf), 
     tEsf = i.Sum(rr => rr.Esf), 
     tESale = i.Sum(rr => rr.ESale) 
    }) 

Это прекрасно работает в LinqPad4, но в vs2012 бросает исключение:

«Методы 'Single' и «SingleOrDefault» может использоваться только как окончательная операция запроса . Вместо этого используйте метод «FirstOrDefault» в ».

Как я могу решить эту проблему?

+4

Используйте FirstOrDefault как ошибка говорит вам –

+0

Используйте FirstOrDefault и нулевую проверку перед проверкой имущества PersonnelId, в противном случае появится аргумент NULL исключение. – Dreamweaver

+0

@ StephenKennedy Стоит помнить, что не все здесь имеют английский как свой первый язык ... – DavidG

ответ

0

Я нахожу это решение.

NazelShifts.Where(i => i.ShiftId == 1) 
     .Join(Nazels, 
        ns => ns.NazelId, 
        n => n.NazelId, 
        (ns, n) => new { NS = ns, N = n }) 
     .Join(Shifts, 
         nsn => nsn.NS.ShiftId, 
         s => s.ShiftId, 
        (nsn, s) => new { NSN = nsn, S = s })   
     .Join(PersonnelNazelShifts, 
         nsns =>new{ nsns.NSN.N.NazelId,nsns.S.ShiftId}, 
         pns =>new { pns.NazelId,pns.ShiftId}, 
        (nsns, pns) => new { NSNS = nsns, PNS = pns }) 
    .Join(Tanks, 
         nsnspns => nsnspns.NSNS.NSN.N.TankId, 
         t => t.TankId, 
        (nsnspns, t) => new { NSNSpns = nsnspns, T = t }) 
    .GroupBy(i => new { i.T.FuelId,i.NSNSpns.NSNS.NSN.NS.ShiftId,i.NSNSpns.PNS.PersonnelId }) 
    .Select(i => new 
           { 
            i.Key.ShiftId, 
            i.Key.PersonnelId, 
            i.Key.FuelId, 
            tEold = i.Sum(rr => rr.NSNSpns.NSNS.NSN.NS.Eold), 
            tEr = i.Sum(rr => rr.NSNSpns.NSNS.NSN.NS.Er), 
            tEcf = i.Sum(rr => rr.NSNSpns.NSNS.NSN.NS.Ecf), 
            tEsf = i.Sum(rr => rr.NSNSpns.NSNS.NSN.NS.Esf), 
            tESale = i.Sum(rr => rr.NSNSpns.NSNS.NSN.NS.ESale)// not used 
           }) 
Смежные вопросы