【发布时间】:2015-06-06 12:16:36
【问题描述】:
我有 5 张桌子:
NazelShifts
纳泽尔
坦克
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 与 Nazel 和 Shift 多对一 PersonnelNazelShift 与 Nazel 和 Shift 也有多对一的关系。
我需要运行这个查询:
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 因为错误告诉你
-
在检查 PersonnelId 属性之前使用 FirstOrDefault 和 null 检查,否则会出现参数 null 异常。
-
@StephenKennedy 值得记住的是,并非这里的每个人都以英语为第一语言...
-
@DavidG 公平点,但看看修订历史。尤其是#4。
-
@DavidG,这可能是真的,但无论如何他都会得到英文答案,不是吗?
标签: c# entity-framework group-by