2012-04-20 149 views
9

Quiero resumir tres campos diferentes de una tabla en una consulta. Quiero un LINQ equivalente de este T-SQL:Obtener la suma de dos columnas en una consulta LINQ sin agrupar

select sum(fld1), SUM(fld2), SUM(fld3) from MyTable where classID = 5 

Todos los ejemplos que he encontrado bien utilizar un grupo de o llame a la consulta varias veces, una para cada campo que necesita ser resumido.

Tengo algo como esto ahora. Pero no quiero agregar una cláusula group by, ya que no se requiere en su formulario T-SQL.

from a in MyTable 
where a.classID == 5 
group a by a.classID into g 
select new 
{ 
Sumfld1 = g.Sum(x => x.fld1), 
Sumfld2 = g.Sum(x => x.fld2), 
Sumfld3 = g.Sum(x => x.fld3) 
} 

¿Alguna sugerencia? Gracias por tu tiempo.

+1

Puede usar 'group a by 1 in g' para aplicar el grupo necesario sin ningún efecto. – mellamokb

+0

¿Realmente hace una diferencia práctica no introducir la cláusula group by? ¿Cuánto tiempo dura la consulta en ambos sentidos? – Enigmativity

+0

¿Por qué se agrupan en classId cuando también filtra en classId. ¿Por qué no simplemente abandonar el grupo? –

Respuesta

1
var x = from a in MyTable 
     where a.classID == 5 
     select a; 

int? Sumfld1 = x.Sum(y => y.fld1); 
int? Sumfld2 = x.Sum(y => y.fld2); 
int? Sumfld3 = x.Sum(y => y.fld3); 
+2

esto parece que llamará a la consulta en var X para cada x.Sum (..) Lo intentaré e informaré. Gracias. – user20358

+0

@ user20358 ¿QUÉ SABÍAS? –

9

como resulta que, en LINQ to SQL se puede llegar muy cerca haciendo:

from a in MyTable 
where a.classID == 5 
group a by 0 into g 
select new 
{ 
    Sumfld1 = g.Sum(x => x.fld1), 
    Sumfld2 = g.Sum(x => x.fld2), 
    Sumfld3 = g.Sum(x => x.fld3) 
} 

(tenga en cuenta el grupo de)

No se traduce en un sql GROUP BY, pero un SELECT de múltiples SUM s de una subconsulta. En términos de plan de ejecución, puede ser el mismo.

Entity Framework todavía crea un GROUP BY, aunque por 0.

Cuestiones relacionadas