【问题标题】:Entity Framework Count and Group By in a Collection集合中的实体框架计数和分组依据
【发布时间】:2015-10-02 21:47:01
【问题描述】:

我有返回正确过滤数据的 Lambda 表达式,但我需要对返回的记录进行一些计算。

我有两个具有多对多关系的实体(用户和语言),我需要对返回者的语言进行分组计数,以便找出有多少人使用每种返回的语言。

Lambda 表达式返回的数据样本集:

  • User1(英语、西班牙语)
  • User2(英语、法语)
  • User3(英语、西班牙语)

期望的结果:

  • 英文3
  • 西班牙语 2
  • 法语 1

我尝试使用 GroupBy () 和 select (),但仅通过对结果进行 foreach 得到正确的结果,但想使用 Lambda 执行此操作。

[编辑] 解决方案的关键是使用 SelectMany () 与 GroupBy() 组合的结果扁平化。感谢@Christos 指出正确的答案。

【问题讨论】:

  • 关系是many-many,所以每种语言都应该有一些导航属性,比如Users,所以你可以简单地做var langInfo = context.Languages.Select(e => new { Language = e, Count = e.Users.Count }).ToList();之类的事情
  • 我只需要对原始结果中包含的元素进行计数和分组。仅仅为了计数而重新查询的海岸是昂贵的。
  • 你不需要查询所有用户来获取它的计数,如果你想知道如何,尝试谷歌搜索或搜索关于显式加载。当然,在这样做之前,lazy loading 应该先暂时禁用。如果您目前只有一些已加载的用户,请按照以下答案的方法(类似这样)。

标签: c# entity-framework lambda


【解决方案1】:

你可以试试这样的:

var results = data.SelectMany(user=>user.Languages)
                  .GroupBy(language=>language)
                  .Select(gr=>new { Language = gr.Key, Total = gr.Count()});

假设每个用户对象都有一个字符串序列IEnumerable<string>,称为语言并保存用户的语言。此外,您拥有的数据是所有用户的序列。

【讨论】:

  • 事实上,语言是语言的集合(IEnumerable)。无论如何,我想我可以调整你的答案。我会测试它。 Tks
  • 只是一个小的修正:Key 和 Count 来自 gr 而不是来自语言。谢!纠正这个,就像一个魅力。
  • @Douglas Gandini 你是对的!非常感谢您发现这一点。不客气。我很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多