2017-10-13 55 views
0

爲了上帝的緣故,有人幫助我...我花了整整一個早上學習linq和lambda表達式,但仍然得不到我所需要的。如何將此T-SQL轉換爲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); 

但是,這隻返回總和列。如何讓所有列與上面的示例完全相同。

回答

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() 
       }; 
0

您需要包括你需要到您的.Select這樣的所有列:

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