我以为Linq GroupBy总是会产生唯一的键,但是当我使用GroupByDictionary的结果投影到.ToDictionary()时,我收到一条错误消息:“已经添加了具有相同键的项”:

c# - 在ToDictionary中使用GroupBy的 key 时,为什么会出现 "key already added"错误?-LMLPHP

这是有问题的代码:

return DbContext.Responsibilities
    .GroupBy(r => r.RoleCode)
    .ToDictionary(g => g.Key, g => g.Count());

[这里Responsibilities是其DbSet成员是简单RoleCode属性的实体的int。]

如果我将其更改为产生一系列匿名类型,然后从中创建字典,则该字典将运行而不会出现错误:
return DbContext.Responsibilities
    .GroupBy(r => r.RoleCode)
    .Select(g => new { Code = g.Key, Count = g.Count() })
    .ToDictionary(i => i.Code, i => i.Count);

为什么会有如此不同?

仅供引用,如果我创建一个临时的List变量来保存匿名类型,则值如下:

c# - 在ToDictionary中使用GroupBy的 key 时,为什么会出现 "key already added"错误?-LMLPHP

因此,没有重复的 key 。

最佳答案

一个简单的Google搜索将我带到了这篇博客文章:

http://code-ninja.org/blog/2014/07/24/entity-framework-never-call-groupby-todictionary/

简单的答案是,ToDictionary不会转换为Entity Framework查询,但会枚举Group By的结果。

09-28 04:05