在ToDictionary中使用GroupBy的密钥时,为什么会出现“密钥已添加”错误?

Gar*_*ill 6 c# linq

我以为Linq GroupBy总是会产生唯一的键,但是当我将a的结果投影GroupByDictionaryusing中时.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变量来保存匿名类型,则值如下:

在此处输入图片说明

因此,没有重复的密钥。

Gor*_*ski 3

一个简单的谷歌搜索让我找到了这篇博文:

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

简单的答案是 ToDictionary 不会转换为实体框架查询,但它会枚举 Group By 的结果。

  • 不过,“简单答案”部分并没有真正解释它 - `GroupBy` 的逻辑结果 *应该* 能够被输入到一个简单的 ToDictionary 调用中。问题在于,当紧随其后的是 ToDictionary 时,它并没有真正正确地执行 GroupBy。我们不需要翻译 ToDictionary 本身,但我们*确实*需要适当翻译 GroupBy。 (2认同)
  • 这确实解释了这一点。或者至少,这是我可以遵循的建议(不要对“GroupBy”的结果调用“ToDictionary”)。所以谢谢 - 这就是我真正需要的。不过,我希望你不要使用尖酸刻薄的“简单的谷歌搜索”。我确实搜索过这个,但没有找到任何东西。也许我使用了糟糕的搜索词。告我 :-)。 (2认同)