2011-10-04 95 views
1

我從表(id,名稱)中選擇多個列。我想取回具有不同名稱的記錄。我想知道如何在LINQ中做到這一點。在Linq中選擇多個列時在列上選擇DISTINCT

下面的代碼返回一個Dictionary<string,string>

return db.CourseTypes 
    .Select(ct => new { ct.Id, ct.Name}) 
    .AsEnumerable() 
    .ToDictionary(kvp => kvp.Id.ToString(), kvp => kvp.Name); 
} 

如何我一定要回去與不同的值記錄在「名稱」列?

+1

當兩行具有相同的「名稱」時會發生什麼?這些行中的任何一行都應該返回?或者第一個?或者是其他東西? – svick

回答

2

比StriplingWarrior的(我認爲),並略少的問題稍微簡單的方法:

return db.CourseTypes 
     .GroupBy(ct => ct.Name, ct => ct.Id) 
     .ToDictionary(group => group.First(), group => group.Key); 

注意,這裏假設你的ID是獨特的 - 如果兩個不同的名字有相同的ID,ToDictionary會失敗。

另請注意,如果您有多個具有相同名稱的ID,則假設您並不在乎地圖中的哪一個。如果你想確保它的(說)最早的名稱,你可以這樣做:

return db.CourseTypes 
     .GroupBy(ct => ct.Name, ct => ct.Id) 
     .ToDictionary(group => group.OrderBy(x => x).First(), 
         group => group.Key); 

現在它可能是,將做可查詢在錯誤的點可枚舉的過渡,所以你可能想:

return db.CourseTypes 
     .GroupBy(ct => ct.Name, ct => ct.Id) 
     .Select(g => new { Name = g.OrderBy(x => x).First(), Id = g.Key }) 
     .ToDictionary(g => g.Name, g => g.Id); 

這是更容易做數據庫內的所有排序等一氣呵成......我認爲 ...這是值得檢查記錄,雖然。

+0

ID是唯一的,所以你的第一個例子工作。我是一個Linq新手,所以它對我來說有點神祕。 ToDictionary'group => group.First()'的第一個參數是做什麼的? –