c# - 在 linq to entities 查询中获取子项计数

标签 c# linq-to-entities

我的数据库 (MySql) 中的两个表之间存在多对多关系:

  • 类别(id、名称、id_parent)
  • 声音(id,名字)

一个类别可以有 1 个父类别,因此一个类别可以有很多子类别。如果一个类别至少有一个子类别,则其中没有声音。我不允许将声音和子类别放在一起。

所以对于一个父类,我想得到所有可能有 child 的 child ,可能有 child (...),我想递归地计算所有 child 的声音。

例子:

Cat -> (CCat1 -> CCCat11(2 个声音), CCat2 (5 个声音), CCat3 -> CCat31 -> CCCat311 -> (CCCCat3111 (10 个声音), CCCCat3111 (1 个声音))

没有深度限制,这就是为什么我需要一种“递归”方式来计算声音的原因。

  • Cat 有 3 个 child 。
  • CCat1 有 1 个 child 。
  • CCat2 没有 child 。
  • CCat3 有 1 个 child 有 1 个 child 有 2 个 child 。

Cat.nbSounds = 18

最佳答案

答案在于 SelectMany 运算符的用户。

int count_soundsinparent = parentCategory
    .Select(x=> x.ChildCategory)
    .SelectMany(x=> x.Sounds)
    .Count();

假设您会使用常规的Select;它会向您返回一个列表(每个子类别一个项目)的声音列表(子类别具有的每个声音一个项目),从而创建一个二维列表。

SelectMany 所做的是获取该列表的所有元素,并将其放入一维列表中。然后你计算该列表中的项目,瞧,你有总数。

关于c# - 在 linq to entities 查询中获取子项计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12949382/

相关文章:

linq - 将 IEqualityComparer 与 LINQ to Entities except 子句结合使用

c# - 在 MySql 连接字符串中使用密码? C#

c# - 如何比较两个列表中的值

c# - 如何在内存中创建Xml文件上传到服务器

c# - Linq 设置内部属性的最佳方式

c# - 在 Entity Framework 中加入多个实体,2 个 DbSet 和一个列表

linq - 代码第一次接近错误: The specified type member 'xxxxx' is not supported in LINQ to Entities

c# - 模型类中的 EF 上下文

c# - 在 parallel.foreach 范围之外递增计数值

c# - LINQ to Entities 选择带有表达式参数的列