2010-08-19 44 views
89

我有一個這樣的名單:如何使用LINQ做SELECT UNIQUE?

Red 
Red 
Brown 
Yellow 
Green 
Green 
Brown 
Red 
Orange 

我試圖做一個選擇唯一使用LINQ,即我想

Red 
Brown 
Yellow 
Green 
Orange 

var uniqueColors = from dbo in database.MainTable 
        where dbo.Property == true 
        select dbo.Color.Name; 

然後我把它改爲

var uniqueColors = from dbo in database.MainTable 
        where dbo.Property == true 
        select dbo.Color.Name.Distinct(); 

與沒有成功。第一個select獲取所有顏色,那麼如何修改它以僅獲取唯一值?

如果有更好的方法來構造這個查詢,那麼很高興去那條路線。

我該如何去編輯它,這樣我就可以擁有.OrderBy(「列名稱」),即按字母順序按顏色名稱,所以名稱屬性?

我不斷收到一條消息:

類型參數不能從使用推斷。嘗試明確指定類型參數。

回答

148

鮮明的()會搞亂排序,所以你必須要經過的分揀。

var uniqueColors = 
       (from dbo in database.MainTable 
       where dbo.Property == true 
       select dbo.Color.Name).Distinct().OrderBy(name=>name); 
+3

謝謝,這是正確的答案。有人可以解釋.OrderBy()參數中的內容。你有名字=>名字。這個名字來自數據庫中的列名嗎?因爲我們有'dbo.Color.Name'然後只是'name => name'這暗示我不是列名?奇怪它也正確排序,如果我只是將其更改爲'.OrderBy(a => a)' – baron 2010-08-19 23:29:22

+3

變量的名稱是不相關的。它只是{傳入函數的對象} => {用於排序的對象}。由於我們已經完成了Select,因此集合中唯一被排序的是名稱。 – 2010-08-20 11:35:53

+0

謝謝@JamesCurran,你的解決方案對我非常有幫助。 – Ron 2013-04-04 17:11:14

19
var uniqueColors = (from dbo in database.MainTable 
        where dbo.Property == true 
        select dbo.Color.Name).Distinct(); 
+2

+1,但我建議你使用一個代碼塊爲您的代碼 – 2010-08-19 06:37:56

10

使用查詢理解語法,你可以實現排序依據如下:

var uniqueColors = (from dbo in database.MainTable 
        where dbo.Property 
        orderby dbo.Color.Name ascending 
        select dbo.Color.Name).Distinct(); 
+0

嗯......未達成字母排序 - 由於某種原因......我切換升序和降序,得到了相同的結果。是否有明顯的說法影響它?可能需要在此之後訂購? – baron 2010-08-19 07:06:20

+0

可能嘗試 變種uniqueColors從結果=在(從database.MainTable DBO其中dbo.Property 選擇dbo.Color.Name).Distinct() 的OrderBy結果升序; – cordialgerm 2010-08-19 07:17:11