2012-04-20 15 views
9

Voglio riassumere tre campi diversi di una tabella in una query. Voglio un LINQ equivalente di questo T-SQL:Ottieni la somma di due colonne in una query LINQ senza raggruppamento

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

Tutti gli esempi che ho trovato sia utilizzare un gruppo o di chiamare la query più volte, una volta per ogni campo che ha bisogno di essere riassunta.

Ho qualcosa di simile ora. Ma non voglio aggiungere un gruppo per clausola poiché non è richiesto nel suo modulo 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) 
} 

Qualche suggerimento? Grazie per il tuo tempo.

+1

È possibile utilizzare 'raggruppa per 1 in g' per applicare il gruppo necessario senza alcun effetto. – mellamokb

+0

Fa davvero una differenza pratica non introdurre la clausola group by? Quanto dura la query in entrambi i modi? – Enigmativity

+0

perché stai raggruppando su classId quando filtri anche su classId. Perché non lasciare semplicemente il gruppo? –

risposta

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

sembra che chiamerà la query in var X per ogni x.Sum (..). Proverà e segnalerà. Grazie. – user20358

+0

@ user20358 CHE COSA HAI SCELTO? –

9

Come si è visto, in LINQ to SQL si può ottenere molto vicino facendo:

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

(notare il gruppo da)

E non si traduce in un sql GROUP BY, ma un di più SUM s da una sottoquery. In termini di piano di esecuzione potrebbe anche essere lo stesso.

Entity Framework crea ancora un GROUP BY, anche se per 0.