我以为Linq GroupBy
总是会产生唯一的键,但是当我使用GroupBy
将Dictionary
的结果投影到.ToDictionary()
时,我收到一条错误消息:“已经添加了具有相同键的项”:
这是有问题的代码:
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
变量来保存匿名类型,则值如下:因此,没有重复的 key 。
最佳答案
一个简单的Google搜索将我带到了这篇博客文章:
http://code-ninja.org/blog/2014/07/24/entity-framework-never-call-groupby-todictionary/
简单的答案是,ToDictionary不会转换为Entity Framework查询,但会枚举Group By的结果。