2

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

  • 类别(id、名称、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

4

3 回答 3

3

答案在于SelectMany运营商的用户。

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

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

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

于 2012-10-18T08:19:03.777 回答
1

递归地

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

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

于 2012-10-18T08:23:58.263 回答
0

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

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

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

于 2012-10-20T15:57:42.637 回答