Załóżmy, że mamy następującą instrukcję SQL:
select sum(A), max(B), avg(C) from TBL group by D
spróbować tego w 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)
}
- albo w 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)
Oczywiste, który byłby w VB:
aggregate t in TBL into s = Sum(t.A), m = Max(t.B), a = Average(t.C)
mimo to daje takie same wyniki, to ma wyższy koszt, ponieważ wystawia wiele instrukcji SQL Select, po jednym dla każdej funkcji agregującej, tzn. będzie wykonywany w wielu przejściach.Pierwsza składnia, daje pojedynczą (dość złożoną, ale wydajną) instrukcję SQL, która wykonuje pojedyncze przejście do bazy danych.
PS. Jeśli nie masz klucza, według której grupy przez (czyli trzeba pojedynczy wiersz w wyniku, obejmujący cały zestaw danych), należy użyć stałej, jak w:
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 ciekawych pytanie, Sam nie zaglądałem w to, ale byłoby dziwnie, gdyby to nie zadziałało. Nie możesz użyć składni "let"? –
@Thomas, o ile widzę, nie można przypisać zestawu za pomocą 'let', ale raczej pojedynczej wartości dla elementu w zestawie. Korzystam z EF od kilku miesięcy i byłem zaskoczony, że uderzyłem dziś w tę barierę. Naprawdę nie sądzę, że to możliwe! –
@ Hunter's deleted answer Działa. Spróbowałeś? Również 'let' rzeczywiście działa z zestawami. Czy próbowałeś tego? Mam kod produkcyjny, który wykonuje oba. –