【问题标题】:How to transform this T-SQL into lambda expression (Group and Sum)如何将此 T-SQL 转换为 lambda 表达式(组和求和)
【发布时间】:2017-10-13 23:13:15
【问题描述】:

看在上帝的份上,请帮帮我……我整个上午都在努力学习 linq 和 lambda 表达式,但我仍然无法得到我需要的东西。

我有这个问题:

select IDHOLDINGGRUPO, IDUNIDADE, IDOPERADORA, ANOPROC, MESPROC, DATACONHECIMENTO, TIPO, sum(VALOR) as TOTAL
from VIEW_EVENTOS_ATENDIMENTOS
group by IDHOLDINGGRUPO, IDUNIDADE, IDOPERADORA, ANOPROC, MESPROC, DATACONHECIMENTO, TIPO

返回这个结果:

IDHOLDING IDUNIDADE IDOPERADORA ANOPROC MESPROC DATACONHECIMENTO TIPO TOTAL
1           1           1        2001       1       2001-01-01     A   150.00
1           2           1        2001       1       2001-01-01     A   300.00      

我正在尝试使用 lambda 表达式获得相同的结果。比如:

var Resultado = lista
                  .GroupBy(x => new { x.HoldingGrupoDto.Id, Id2 = x.UnidadeDto.Id, Id3 = x.OperadoraDto.Id, x.DataConhecimento, x.AnoProc, x.MesProc })
                  .Select(group => group.Sum(item => item.Valor)).FirstOrDefault() ?? default(double);

但这只会返回总和列。如何获取所有列,与上面的示例完全相同。

【问题讨论】:

    标签: c# linq lambda


    【解决方案1】:

    您的投影 (.Select) 是正确的。您应该为对象添加额外的属性:

    var Resultado = lista.GroupBy(x => new { Id1 = x.HoldingGrupoDto.Id, Id2 = x.UnidadeDto.Id, Id3 = x.OperadoraDto.Id, x.DataConhecimento, x.AnoProc, x.MesProc })
                         .Select(group => new {
                             Key = group.Key,
                             Valor = group.Sum(item => item.Valor)
                         }).FirstOrDefault();
    

    更好的写法是:

    var Resultado = lista.GroupBy(key => new { Id1 = key.HoldingGrupoDto.Id, Id2 = key.UnidadeDto.Id, Id3 = key.OperadoraDto.Id, key.DataConhecimento, key.AnoProc, key.MesProc },
                                  item => item.Valor)
                         .Select(g => new {
                              g.Id1,
                              g.Id2,
                              g.Id3,
                              g.DataConhecimento, 
                              g.AnoProc, 
                              g.MesProc,
                              Valor = g.Sum()
                         }).FirstOrDefault();
    

    但在这种情况下,IMO 使用查询语法看起来更简洁:

    var resultAdo = from x in lista
                    group x.Valor by new { Id1 = x.HoldingGrupoDto.Id, Id2 = x.UnidadeDto.Id, Id3 = x.OperadoraDto.Id, x.DataConhecimento, x.AnoProc, x.MesProc } into g
                    select new {
                        g.Id1,
                        g.Id2,
                        g.Id3,
                        g.DataConhecimento, 
                        g.AnoProc, 
                        g.MesProc,
                        Valor = g.Sum()
                    };
    

    【讨论】:

      【解决方案2】:

      您需要将所需的所有列包含到您的.Select 中,如下所示:

      ...
          .Select(group => new {group.Id, group.Id2, SumValor = group.Sum(item => item.Valor), ...})
      ...
      

      【讨论】:

        猜你喜欢
        • 2019-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多