2012-09-04 34 views
12

當用作具有多個Into子句的Linq表達式的第一個(外部)子句時,VB.NET的Aggregate查詢是否有致命缺陷,因爲每個Into子句都是分別執行的?由於每個分詞都單獨執行,因此是否具有集體致命缺陷?

的「明顯的」答案SELECT MIN(ZoneMin), MAX(ZoneMin) FROM Plant in LINQ to SQL

Dim limits = Aggregate p In Plants Select p.ZoneMin Into Min(), Max() 

然而,這個答案其實檢索每個MinMax(如果你包括像CountAverage其它集合函數)在單獨 SQL查詢。這可以很容易地在LINQPad中看到。

LINQPad沒有顯示一個事務(或其他使這些查詢爲原子的東西),還是這是一個等待發生的競爭條件? (所以你必須做上述問題的答案中顯示的技巧來強制一個查詢返回多個聚合。)

總之,是否有一個使用Aggregate的LINQ-to-SQL查詢返回多個聚合函數在單個(或至少「原子」)查詢?

(我也說「很明顯」,因爲明顯的答案對我來說,Aggregate p In Plants Into Min(p.ZoneMin), Max(p.ZoneMin),實際上獲得了整個表的兩倍,優化甚至當,然後使用LINQ到實體MinMax以獲得結果: - ()

我以爲Aggregate不是VB-具體,但它看起來像C#沒有這個查詢表達式,所以我已經改變了

+0

您可能可以通過跟蹤SQL服務器本身來驗證查詢是否在事務中,它應該顯示它(但我不能100%確定它)。但是,如果性能不是主要問題,則最好讀取整個數據集並進行彙總(基本上,處理數據的快照)。 – Alex

+0

請注意,這就是我希望我的原始'Into Min(p.ZoneMin)'查詢會優化到,因爲查詢的SQL部分現在是相同的。也許JITter可能仍然可以看到,但LINQPad的/ o +沒有。 –

+0

雖然你只是用SQL支持的函數進行聚合,但最好是按照「不變的技巧分組」來讓數據庫進行聚合。 –

回答

0

要回答我的更廣泛的問題:是Aggregate打破了生產單獨的SQL查詢沒有交易?

所有的LINQ都可能導致,如果你不仔細調整你的查詢只會導致一個SELECT,這可能是不可能的,沒有「放棄」,檢索一個查詢中的較大結果,然後使用Linq-to-Objects來聚合或以其他方式處理數據。例如,This 'query'

因此,一般來說,程序員應確保交易是在可能導致多個查詢的LINQ查詢中添加的。我們只需要知道哪些LINQ查詢可以轉換爲多個SQL查詢。

1

Alt鍵。霍夫它不使用以下語法使用聚合關鍵字,你可以在一個單一的查詢做多的功能:

Dim query = From book In books _ 
    Group By key = book.Subject Into Group _ 
    Select id = key, _ 
     BookCount = Group.Count, _ 
     TotalPrice = Group.Sum(Function(_book) _book.Price), _ 
     LowPrice = Group.Min(Function(_book) _book.Price), _ 
     HighPrice = Group.Max(Function(_book) _book.Price), _ 
     AveragePrice = Group.Average(Function(_book) _book.Price) 

目前確實出現了與總條款執行的問題雖然。考慮以下來自Northwind的查詢:

Aggregate o in Orders 
into Sum(o.Freight), 
Average(o.Freight), 
Max(o.Freight) 

這會發出3個數據庫請求。前兩個執行單獨的彙總子句。第三個將整個表拉回到客戶端,並通過Linq將對象上的Max執行到客戶端。

+1

是的,如果你將它改爲'Group By key = 0 Into Group'(並放棄不需要的'id = key,'),你會得到我在問題的答案中描述的「按常量分組」提到,允許在整個表格上進行聚合。 –

+0

在我的示例中,我確實希望分組。如果你想把它放在整個桌子上,那麼你的不變技巧就可以正常工作。 –

+0

我認爲你的後一點與'Freight'類型有關,並且出於某種原因,Linq認爲SQL的'MAX'可能返回與它認爲'Max'應該返回的值不同的值。但_3__paparate__數據庫請求_是我的問題所關心的。 –

相關問題