如何将此T-SQL转换为lambda表达式(Group和Sum)

时间:2017-10-13 14:49:48

标签: c# linq lambda

为了上帝的缘故,有人帮助我......我整个上午都在努力学习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);

但这只返回sum列。如何将所有列完全相同,与上面的示例相同。

2 个答案:

答案 0 :(得分: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()
                };

答案 1 :(得分:0)

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

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