У меня есть 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» в ».
Как я могу решить эту проблему?
Используйте FirstOrDefault как ошибка говорит вам –
Используйте FirstOrDefault и нулевую проверку перед проверкой имущества PersonnelId, в противном случае появится аргумент NULL исключение. – Dreamweaver
@ StephenKennedy Стоит помнить, что не все здесь имеют английский как свой первый язык ... – DavidG