2012-03-19 73 views
13

以下基本的LINQ to SQL語句不會導致按順序工作。正如你在T-SQL中看到的,沒有orderby。你知道爲什麼嗎?使用DISTINCT時,LINQ to SQL不會生成ORDER BY?

LINQ到SQL:在下面的TSQL

SELECT 
[Distinct1].[unit_number] AS [unit_number] 
FROM (SELECT DISTINCT 
[Extent1].[unit_number] AS [unit_number] 
FROM [dbo].[t_harvest_statistics] AS [Extent1] 
    ) AS [Distinct1] 
+0

是unit_number標識列後? – asawyer 2012-03-19 04:21:09

+0

不,unit_number不是身份。這是一個int數據類型 – KeelRisk 2012-03-19 04:21:42

回答

28

 var results = (from stats in db.t_harvest_statistics 
         orderby stats.unit_number 
         select stats.unit_number).Distinct().ToList(); 

上面的結果,是SQL及所處ORDER BY是相對於關係代數的限制到DISTINCT。

由於ORDER BY是一個視圖操作,因此必須在SQL中(「頂級」)進一步「出」。雖然一個可以通過編寫與RA操作有關的具有ORDER BY「進一步」的SQL,但它通常會導致未定義行爲(有時可行)。有鑑於此,Linq2Sql是可以自由忽略 ORDER BY,雖然也許是一個例外會更好......不管怎麼說它都不會那麼微妙;-)(實際上,同樣的問題存在於任何 Linq提供程序沒有提供「更嚴格」的Distinct定義。)

刪除Distinct()並且Linq2Sql應該再次生成ORDER BY按預期方式。解決方案只是切換操作的順序,以便ORDER BY再次處於「頂層」。

這是文章Use of Distinct and OrderBy in LINQ所涵蓋:

此行爲可能會覺得奇怪。 問題是Distinct運算符不會授予它將保持原始值的順序。應用於LINQ to SQL,這意味着在像queryA這樣的查詢的情況下可以忽略排序約束。

該解決方案是相當S [I] mple:把排序依據操作者的一個鮮明後,如以下queryB定義:

var queryB = 
    (from o in db.Orders 
    select o.Employee.LastName) 
    .Distinct().OrderBy(n => n); 

編碼愉快。

+1

我有點困惑(n => n)...但它的工作原理! – KeelRisk 2012-03-19 04:50:08

+1

@KeelRisk'OrderBy'需要一些東西,因爲沒有'OrderBy()'過載(如果它存在的話,會以相同的方式定義)。我猜'OrderByYeSelf'的情況並不被認爲是特別的;-) – 2012-03-19 04:53:49

0

從交易表中排序年份時,我得到同樣的問題。

試試這個

var results = (from stats in db.t_harvest_statistics 
         select stats.unit_number).Distinct().OrderBy(x =(Int16)x.unit_number).ToList(); 

得到不同值時使用的OrderBy方法