2009-05-24 54 views
0

它似乎是這樣,但我無法找到關於這個問題的任何明確的文件。Linq到Sql中的組是否已按Count()降序排序?

什麼我問的是,如果該查詢的結果:

​​

是永遠不變的是下面的查詢:

from x 
in Db.Items 
join y in Db.Sales on x.Id equals y.ItemId 
group x by x.Id into g 
select g.First() 

注意,第二個查詢讓LINQ的決定排序第一個查詢設置爲銷售數量,從最多到最少。

我的臨時測試似乎表明Linq以這種方式自動對組進行排序,而documentation似乎表明情況正好相反 - 項目按照它們出現在select中的順序返回。我想,如果它按照這種方式排序,增加額外的排序是毫無意義的,浪費週期,並且會更好地排除在外。

+0

你打開了Sql Profiler嗎?它實際上在Select的結尾附加了一個orderby嗎? – BFree 2009-05-24 16:38:46

回答

4

您可能會看到這一點,因爲從sqlserver返回的查詢結果在您的測試中總是以相同的順序。然而,這是一個謬誤:根據定義,SQL中的集合沒有順序,除非它是用ORDER BY明確指定的。因此,如果您的查詢沒有按語句順序排列,那麼您的集合可能看起來像是按順序排列的,但情況並非如此,可能是在邊緣情況下順序不同(例如,當服務器必須裝入由於內存限制或其他原因,表格按不同順序排列)。所以經驗法則:如果你想要一個訂單,你必須指定一個。

1

LINQ分組並不能保證這樣的事情。雖然它可能適用於特定情況,但在另一種情況下可能不起作用。 避免依靠此副作用。順便說一下,如果由於聚簇索引或其他原因,輸出實際上是由SQL Server有意排序的,那麼添加一個ORDER BY子句不會受到傷害,因爲查詢優化器應該足夠聰明以知道結果已經排序,所以你不會失去任何東西。

1

如果規格不能保證訂購,您應該認爲這是偶然的,並隨新版本軟件的變化而變化。

不要把它拿出來,除非

一)你已經測量它,它使一個顯著差異

b)您願意進行監視,測試,並改回(無處不在)在您的軟件環境發生微小變化之後。