2017-10-13 9 views
0

Pour l'amour de Dieu, aidez-moi ... J'ai passé toute la matinée à essayer d'apprendre les expressions linq et lambda, mais je n'arrive toujours pas à obtenir ce dont j'ai besoin .Comment transformer ce T-SQL en expression lambda (Groupe et Sum)

J'ai cette requête:

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 

Ce qui me renvoie ce résultat:

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  

J'essaie d'obtenir le même résultat avec une expression lambda. Quelque chose comme:

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

Mais cela ne renvoie que la colonne de somme. Comment obtenir toutes les colonnes, exactement les mêmes, à l'exemple ci-dessus.

Répondre

1

Votre projection (.Select) est en bonne. Vous devez ajouter des propriétés supplémentaires à l'objet:

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

Une meilleure façon de l'écrire serait:

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

Mais regarde l'OMI plus propre à utiliser la syntaxe de requête dans ce cas:

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

Vous devez inclure toutes les colonnes dont vous avez besoin dans votre .Select comme ceci:

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