【问题标题】:Select DISTINCT on a column when selecting multiple columns in Linq在 Linq 中选择多列时在列上选择 DISTINCT
【发布时间】:2011-10-05 06:47:35
【问题描述】:

我正在从一个表中选择多个列(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);
}

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

【问题讨论】:

  • 当两行有相同的Name时会发生什么?应该返回这些行中的任何一个吗?还是第一个?还是别的什么?

标签: linq linq-to-sql


【解决方案1】:

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

这样更有可能一次性完成数据库中的所有排序等操作...我认为...尽管检查日志是值得的。

【讨论】:

  • ID 是唯一的,因此您的第一个示例有效。我是 Linq 新手,所以它的工作原理对我来说有点神秘。 ToDictionary 'group => group.First()' 的第一个参数是做什么的?
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 2012-08-07
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多