2017-10-13 7 views
0

神様のおかげで誰かが私を助けてくれます...私はlinqとラムダ式を学びたいと思っていましたが、 。私は、この結果を返しますこのT-SQLをラムダ式に変換する方法(グループとサム)

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  

私はこのクエリを持っています。次のようなものがあります。

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

しかし、これは合計列のみを返します。すべての列を、まったく同じように上記の例にする方法。あなたはこのようなあなたの.Selectにあなたが必要とするすべての列を含める必要が

答えて

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(group => new {group.Id, group.Id2, SumValor = group.Sum(item => item.Valor), ...}) 
... 
関連する問題