在Linq中选择多个列时,在列上选择DISTINCT

时间:2011-10-04 22:40:52

标签: linq linq-to-sql

我正在从表中选择多个列(id,name)。我想找回具有不同名称的记录。我想知道如何在LINQ中这样做。

以下代码返回Dictionary<string,string>

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

如何确保在“名称”列中找回具有不同值的记录?

1 个答案:

答案 0 :(得分:2)

比StriplingWarrior(我认为)稍微简单一点的方法,问题稍微少一些:

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

请注意,这假设您的ID 唯一 - 如果两个不同的名称具有相同的ID,则ToDictionary将失败。

另请注意,如果您有多个具有相同名称的ID,则假设您并不关心地图中的哪个ID。如果你想确定它(比如说)你能做的最早的名字:

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

现在可能会在错误的点上执行Queryable to Enumerable转换,因此可能想要:

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);

这更有可能一次性完成数据库中的所有排序...我 ...但是值得检查日志。