【问题标题】:Get children count in linq to entities query获取 linq 中的子项计数到实体查询
【发布时间】:2018-11-18 20:00:34
【问题描述】:

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

  • 类别(id、name、id_parent)
  • 声音(ID、名称)

一个类别可以有1个父类别,所以一个类别可以有很多子类别。如果一个类别至少有一个孩子,它就没有声音。我不允许声音和子类别一起使用。

因此,对于父类别,我想获取所有可能有子可能有子 (...) 的子,并且我想递归地计算所有子中的声音。

示例:

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

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

  • 猫有 3 个孩子。
  • CCat1 有 1 个孩子。
  • CCat2 没有孩子。
  • CCat3 有 1 个孩子有 1 个孩子有 2 个孩子。

Cat.nbSounds = 18

【问题讨论】:

  • 如果您从数据库中获取此信息,您应该尝试创建一个存储过程。否则,您将不得不向客户端发送大量信息,而使用存储过程您只需发送最终数字。
  • @MrFox:如果您可以创建返回此数据的 LINQ 查询,那么您不会向客户端发送“大量信息”。
  • 我有一种感觉,在这种情况下,单个 LINQ 查询将无法解决问题。我的第一个想法是编写一个递归方法来查找子类别并从中返回计数......但这反过来又是很多查询。

标签: c# linq-to-entities


【解决方案1】:

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

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

假设你会使用普通的Select;它将返回一个声音列表(每个子类别一个项目)的列表(每个子类别有一个项目),从而创建一个二维列表。

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

【讨论】:

  • 我不能尝试这个,因为我需要先得到所有孩子,所以我编辑了我的帖子:)
  • 你确定通过这个请求我得到了所有的声音吗?因为在 childcategory 我也可以有孩子
  • 是的,我发现得太晚了。这仅在您只有 1 级后代时才有效。不过,您可以使用递归函数来修复它。让我回复你:)
【解决方案2】:

递归

此要求意味着您不会在单个 LINQ 查询中执行此操作。 Linq 不能真正用 linq to objects 表达递归查询,更不用说像 Linq to Entities 这样更复杂的提供程序了。

使用您描述的架构,您最好编写一个存储过程。如果您有一个嵌套集合模型,您可能能够对左右边缘的数字进行一些数学操作,但可能无法使用这些额外的规则。

【讨论】:

    【解决方案3】:

    经过更多的研究,似乎我们不能做我想做的事。

    所以我创建了一个递归方法来检索孩子并计算每个类别中的声音数量(我计算类别中的声音或我计算类别中的孩子的声音数量)。

    如果你找到了一种神奇的方式来使用 linq to entity,我接受它!

    【讨论】:

      猜你喜欢
      • 2015-04-21
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多