为了上帝的缘故,有人帮助我......我整个上午都在努力学习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列。如何将所有列完全相同,与上面的示例相同。
答案 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), ...})
...