Suponga que tiene la siguiente instrucción SQL:
select sum(A), max(B), avg(C) from TBL group by D
Prueba esto en C# :
from t in table
group t by D
into g
select new {
s = g.Sum(x => x.A),
m = g.Max(x => x.B),
a = g.Average(x => x.C)
}
- o en VB: -
from t in TBL
group t by key = D
into g = group
select s = g.Sum(function(x) x.A),
m = g.Max(function(x) x.B),
a = g.Average(function(x) x.C)
Lo obvio, que en VB sería:
aggregate t in TBL into s = Sum(t.A), m = Max(t.B), a = Average(t.C)
a pesar de que le dará los mismos resultados, tiene una mayor costo ya que emite múltiples sentencias SQL select, una para cada función agregada, es decir, se ejecutará en varias pasadas.La primera sintaxis proporciona una declaración SQL única (bastante compleja, pero eficiente) que hace una sola pasada contra la base de datos.
PS. Si usted no tiene una clave por el cual agrupar por (es decir, que necesitan una sola fila como resultado, que abarca todo el conjunto de datos), utilice una constante como en:
from t in TBL
group t by key = 0
into g = group
select s = g.Sum(function(x) x.A),
m = g.Max(function(x) x.B),
a = g.Average(function(x) x.C)
+1 para la pregunta interesante, no lo he investigado, pero sería extraño si no funcionara. ¿No puedes usar la sintaxis 'let'? –
@Thomas, hasta donde puedo ver, no es posible asignar un conjunto usando 'let', sino más bien un único valor para un elemento en el conjunto. He estado usando EF por unos meses y me sorprendí al golpear esta barrera hoy. ¡Realmente no creo que sea posible! –
La respuesta eliminada de @ hunter funciona. ¿Lo intentaste? Además, 'let' sí funciona con conjuntos. ¿Has probado eso? Tengo un código de producción que hace ambas cosas. –