Dot-Net
單個 Linq-to-Entities 查詢中的多個 SQL 聚合函式
在 SQL 中,您可以在單個數據庫查詢中表達多個聚合,如下所示:
SELECT MIN(p.x), MAX(p.x), MIN(p.y), MAX(p.y) FROM Places p JOIN Logs l on p.Id = l.PlaceId WHERE l.OwnerId = @OwnerId是否可以使用 Linq-to-Entities 做同樣的事情?我發現了一個類似的問題,表明 Linq-to-SQL 不可能,但我想我不必使用四次到數據庫的往返行程來執行上述操作。
假設您有以下 SQL 語句:
select sum(A), max(B), avg(C) from TBL group by D在 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) }– 或者在 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)顯而易見,在 VB 中是:
aggregate t in TBL into s = Sum(t.A), m = Max(t.B), a = Average(t.C)雖然它會給出相同的結果,但它的成本更高,因為它發出多個 SQL 選擇語句,每個聚合函式一個,即它將在多個通道中執行。第一種語法給出了一個(相當複雜但有效的)SQL 語句,它對數據庫執行一次傳遞。
PS。如果您沒有分組依據的鍵(即,您需要單行作為結果,覆蓋整個數據集),請使用常量,如下所示:
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)