【问题标题】:GroupBy with SingleOrDefault in EFGroupBy 与 EF 中的 SingleOrDefault
【发布时间】: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 也有多对一的关系。

图表是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 因为错误告诉你
  • 在检查 PersonnelId 属性之前使用 FirstOrDefault 和 null 检查,否则会出现参数 null 异常。
  • @StephenKennedy 值得记住的是,并非这里的每个人都以英语为第一语言...
  • @DavidG 公平点,但看看修订历史。尤其是#4。
  • @DavidG,这可能是真的,但无论如何他都会得到英文答案,不是吗?

标签: c# entity-framework group-by


【解决方案1】:

我找到了这个解决方案。

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

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2022-07-05
    • 2010-12-17
    • 1970-01-01
    相关资源
    最近更新 更多