Dot-Net

單個 Linq-to-Entities 查詢中的多個 SQL 聚合函式

  • December 13, 2010

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

引用自:https://stackoverflow.com/questions/4431781