Supponiamo di avere la seguente istruzione SQL:
select sum(A), max(B), avg(C) from TBL group by D
Prova questo in 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 in 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)
L'ovvio, che in VB sarebbe:
aggregate t in TBL into s = Sum(t.A), m = Max(t.B), a = Average(t.C)
se darà gli stessi risultati, ha una costo più elevato in quanto emette più istruzioni di selezione SQL, una per ogni funzione di aggregazione, ovvero verrà eseguita in più passaggi.La prima sintassi, fornisce una singola istruzione SQL (abbastanza complessa, ma efficiente) che esegue un singolo passaggio sul database.
PS. Se non si dispone di una chiave con la quale eseguire il raggruppamento (cioè è necessario una singola riga come risultato, che copre l'intero insieme di dati), utilizzare una costante come in:
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 per domanda interessante, non l'ho guardato io stesso ma sarebbe strano se non funzionasse. Non puoi usare la sintassi 'let'? –
@Thomas, per quanto posso vedere non è possibile assegnare un set usando 'let', ma piuttosto un singolo valore per un oggetto nel set. Ho usato EF per alcuni mesi e sono rimasto sorpreso di colpire questa barriera oggi. Davvero non penso sia possibile! –
la risposta cancellata di @ hunter funziona. Hai provato? Inoltre, 'let' funziona davvero con gli insiemi. Hai provato? Ho un codice di produzione che fa entrambi. –