我的数据库(MySql)中的两个表之间有很多到多个关系:
一个类别可以有一个父类别,所以一个类别可以有许多子类别。如果一个类别至少有一个孩子,它里面就没有声音。我不允许声音和儿童分类在一起。
因此,对于一个家长类别,我想让所有可能有孩子的孩子(.)我想对所有孩子的声音进行递归计数。
例:
猫-> (CCat1 -> CCCat11(2音),CCat2 (5音),CCat3 -> CCat31 -> CCCat311 -> (10音),CCCCat3111 (1音))
没有深度限制,这就是为什么我需要一种“递归”的方法来计算声音。
Cat.nbSounds = 18
发布于 2012-10-20 15:57:42
经过更多的研究,我们似乎不能做我想做的事。
因此,我创建了一个递归方法,用于检索子类并计算每个类别中的声音数(我计算类别中的声音或计数类别、子类别、声音数量)。
如果你找到了一种神奇的方法,无论如何,与linq对实体,我接受它!
发布于 2012-10-18 08:19:03
答案在于SelectMany
操作符的用户。
int count_soundsinparent = parentCategory
.Select(x=> x.ChildCategory)
.SelectMany(x=> x.Sounds)
.Count();
假设您使用了一个常规的Select
;它将返回一个声音列表(每个子类别一个项)的声音列表(每个子类别有一个项),从而创建一个二维列表。
SelectMany
所做的就是获取列表中的所有元素,并将其放在一个一维列表中。然后你数一下清单上的物品,瞧,你就有了总数。
发布于 2012-10-18 08:23:58
递归地
这个要求意味着您不会在一个LINQ查询中执行这个任务。Linq实际上不能用linq来表示对象的递归查询,更不用说更多的comlex提供程序,比如Linq到实体。
有了您描述的模式,您最好编写一个存储过程。如果您有一个嵌套的集合模型,您可能可以对左边和右边数做一些数学处理,但可能没有这些额外的规则。
https://stackoverflow.com/questions/12949382
复制相似问题