當用作具有多個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()
然而,這個答案其實檢索每個Min
和Max
(如果你包括像Count
和Average
其它集合函數)在單獨 SQL查詢。這可以很容易地在LINQPad中看到。
LINQPad沒有顯示一個事務(或其他使這些查詢爲原子的東西),還是這是一個等待發生的競爭條件? (所以你必須做上述問題的答案中顯示的技巧來強制一個查詢返回多個聚合。)
總之,是否有一個使用Aggregate
的LINQ-to-SQL查詢返回多個聚合函數在單個(或至少「原子」)查詢?
(我也說「很明顯」,因爲明顯的答案對我來說,Aggregate p In Plants Into Min(p.ZoneMin), Max(p.ZoneMin)
,實際上獲得了整個表的兩倍,優化甚至當,然後使用LINQ到實體Min
和Max
以獲得結果: - ()
我以爲Aggregate
不是VB-具體,但它看起來像C#沒有這個查詢表達式,所以我已經改變了.net到vb.net
您可能可以通過跟蹤SQL服務器本身來驗證查詢是否在事務中,它應該顯示它(但我不能100%確定它)。但是,如果性能不是主要問題,則最好讀取整個數據集並進行彙總(基本上,處理數據的快照)。 – Alex
請注意,這就是我希望我的原始'Into Min(p.ZoneMin)'查詢會優化到,因爲查詢的SQL部分現在是相同的。也許JITter可能仍然可以看到,但LINQPad的/ o +沒有。 –
雖然你只是用SQL支持的函數進行聚合,但最好是按照「不變的技巧分組」來讓數據庫進行聚合。 –