让子项计入linq到实体查询

时间:2012-10-18 07:32:01

标签: c# linq-to-entities

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

  • 类别(id,name,id_parent)
  • 声音(身份证,姓名)

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

因此,对于父类别,我想让所有可能有孩子的孩子都有孩子(...),我想要递归计算所有孩子的声音。

例如:

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

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

  • 猫有3个孩子。
  • CCat1有一个孩子。
  • CCat2没有孩子。
  • CCat3有1个孩子,其中有1个孩子有2个孩子。

Cat.nbSounds = 18

3 个答案:

答案 0 :(得分:2)

答案取决于SelectMany运营商的用户。

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

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

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

答案 1 :(得分:1)

  

递归

此要求意味着您不会在单个LINQ查询中执行此操作。 Linq无法使用linq到对象来表达递归查询,更不用说像Linq to Entities这样的更复杂的提供者。

使用您描述的架构,您最好不要编写存储过程。如果您有嵌套集模型,可能能够对左边和右边数进行一些数学处理,但可能不会使用这些额外规则。

答案 2 :(得分:0)

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

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

如果你找到了一个神奇的方法,无论如何使用linq实体,我就接受了!