我以为Linq GroupBy总是会产生唯一的键,但是当我将a的结果投影GroupBy到Dictionaryusing中时.ToDictionary(),我收到一条错误消息,说“已经添加了具有相同键的项”:
这是有问题的代码:
return DbContext.Responsibilities
.GroupBy(r => r.RoleCode)
.ToDictionary(g => g.Key, g => g.Count());
Run Code Online (Sandbox Code Playgroud)
[这里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);
Run Code Online (Sandbox Code Playgroud)
为什么会有如此不同?
仅供参考,如果我创建一个临时List变量来保存匿名类型,则值如下:
因此,没有重复的密钥。
一个简单的谷歌搜索让我找到了这篇博文:
http://code-ninja.org/blog/2014/07/24/entity-framework-never-call-groupby-todictionary/
简单的答案是 ToDictionary 不会转换为实体框架查询,但它会枚举 Group By 的结果。