2010-03-12 50 views
5

這裏是我的LINQ查詢:排序依據和鮮明的使用LINQ到實體

(from o in entities.MyTable 
orderby o.MyColumn 
select o.MyColumn).Distinct(); 

下面是結果:

{"a", "c", "b", "d"} 

這裏是生成的SQL:

SELECT 
[Distinct1].[MyColumn] AS [MyColumn] 
FROM (SELECT DISTINCT 
    [Extent1].[MyColumn] AS [MyColumn] 
    FROM [dbo].[MyTable] AS [Extent1] 
) AS [Distinct1] 

這是一個錯誤?我的訂單在哪裏,該死的?

回答

10

你應該後Distinct排序,因爲它不與任何保證來對保存的順序:

entities.MyTable.Select(o => o.MyColumn).Distinct().OrderBy(o => o); 
+0

此代碼不能編譯。 OrderBy給出了錯誤:'不能從用法推斷出類型參數。嘗試明確指定類型參數。' – 2010-03-12 20:13:32

+0

哦,我明白了,它需要是'OrderBy(o => o)',因爲到那時候項目已經被選中了(我們正在使用'IQueryable ')。我修復了你的代碼並給你了複選標記 - 謝謝! – 2010-03-12 20:22:30

+0

@BlueRaja:是的,錯過了。感謝您的更正! – 2010-03-12 20:33:19

1

這個問題討論了LINQ的規則,以對象: Preserving order with LINQ

在數據庫,更少的操作保持順序。在區分時,任何地方都不會保留順序(通常使用哈希算法)。

+0

儘管如此,查詢'SELECT DISTINCT ... ORDER BY ...'的工作方式與您在SQL Server中所期望的一樣,並且可能在其他DBMS中使用 - 是否有一個原因,在此情況下,orderby LINQ子句在生成時被忽略SQL(它可能至少會拋出一個錯誤)?我仍然認爲這是一個錯誤 - 在String []上使用時,LINQ查詢正常工作。 – 2010-03-12 21:49:13

+0

如果您檢查查詢計劃,它將顯示ORDER BY發生在DISTINCT之後。因此,ORDER BY中可能出現的內容有嚴格的限制。這是SQL語法混淆的另一種情況。 – 2010-03-13 17:04:52

+0

什麼是「查詢計劃」,以及如何查看它?我使用SQL Server 2008 Profiler獲得了上面的查詢,但它顯然只給你最後的查詢。 – 2010-03-13 18:15:16