Esta es la estructura de mi mesa

ID   A     B     C     D

1    null  10    5     null
2    3     5     null  D2
3    8     null  2     D2
4    null  4     3     D1
5    4     6     1     D2

Esta es la clase c # y su propiedad para almacenar el resultado de la consulta.

public class GrillTotals
{
        public int? SumOfA {get; set;}

        public int? SumOfB{get; set;}

        public int? SumOfC{get; set;}

        public int? CountOfD1{get; set;}

        public int? CountOfD2{get; set;}
}

Lo que espero es:

SumOfA = 15
SumOfB = 20
SumOfC = 11
CountOfD1 = 1
CountOfD2 = 3  

Lo que obtengo es: SumOfA = null, SumOfB = null, SumOfC = null, CountOfD1 = 0, CountOfD2 = 0

Aquí hay un código que he probado.

var _FinalResult = from s in dbContext.tblSchedules
 group s by new
 {
     s.A,
     s.B,
     s.C,
     s.D,
 } into gt
 select new GrillTotals
 {
     SumOfA = gt.Sum(g => g.A),
     SumOfB = gt.Sum(g => g.B),
     SumOfC = gt.Sum(g => g.C),
     CountOfD1 = gt.Count(g => g.D == "D1"),
     CountOfD2 = gt.Count(g => g.D == "D2"),
 };

Trate de corregirme si estoy haciendo algo mal o incorrectamente. Cualquier ayuda será apreciada.

1
Krunal Sisodiya 23 jul. 2016 a las 17:03

2 respuestas

La mejor respuesta

No debe agrupar por los campos en los que desea calcular agregados. Cuando agrupa por ellos, cada agregado (Suma, Mín., Máx., Etc.) devolverá el valor en sí (y Cuenta 1 o 0 según la condición).

Por lo que veo, está tratando de devolver varios agregados con una sola consulta SQL. Si eso es correcto, es posible utilizando la técnica agrupar por constante .

Solo reemplace

 group s by new
 {
     s.A,
     s.B,
     s.C,
     s.D,
 } into gt

Con

group s by 1 // any constant
into gt
2
Ivan Stoev 23 jul. 2016 a las 14:17

Prueba esto:

 var _FinalResult = from s in dbContext.tblSchedules
 group s by new
 {
     s.A,
     s.B,
     s.C,
     s.D,
 } into gt
 select new GrillTotals
 {
     SumOfA = gt.Sum(g => g.A ?? 0),
     SumOfB = gt.Sum(g => g.B ?? 0),
     SumOfC = gt.Sum(g => g.C ?? 0),
     CountOfD1 = gt.Count(g => g.D == "D1"),
     CountOfD2 = gt.Count(g => g.D == "D2"),
 };
0
Michael 23 jul. 2016 a las 14:16