2011-10-04 65 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()'的第一个参数是做什么的? –