2012-10-18 24 views
2

我有很多两个表之间的多对多关系在我的数据库(MySQL的):让孩子们在LINQ数到实体查询

  • 类别(ID,姓名,id_parent)
  • 声音(ID,姓名)

一个类别可以具有1父类,所以一个类别可以有许多C承运。如果某个类别至少有一个孩子,则其中没有声音。我不允许将声音和儿童分类在一起。

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

例:

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

没有深厚的限制,这就是为什么我需要一个 “递归” 的方法来计算的声音。

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

Cat.nbSounds = 18

+1

如果您从数据库中获取此信息,则应尝试创建存储过程。否则,您将不得不向客户端发送大量信息,使用存储过程只需发送最终数字。 – MrFox

+1

@MrFox:如果您可以创建一个返回此数据的LINQ查询,那么您不会向客户端发送“大量信息”。 –

+0

我有一种感觉,在这种情况下,单个LINQ查询不会削减它。我的第一个想法是编写一个递归方法来查找子类别并从它们返回计数...但是这反过来又是很多查询。 – Shaamaan

回答

0

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

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

如果你发现一个不可思议的方式来做到这一点无论如何与linq实体,我把它!

2

答案在于SelectMany操作者的用户。

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

假设你已经使用了常规Select;它会返回一个声明列表(每个儿童类别一个项目)(每个声音子类别都有一个项目),从而创建一个二维列表。

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

+0

我不能尝试这个,因为我需要让所有的孩子以前,所以我编辑我的帖子:) – Titmael

+0

,你确定这个请求我得到的所有声音数?因为在儿童类别我也可以有孩子 – Titmael

+0

是的,我注意到太迟了。这只适用于你只有1级的后代。不过你可以用递归函数修复它。让我回到你身上:) – Flater

1

递归

此要求意味着你不会做,在一个单一的LINQ查询。 Linq无法真正用linq来表达递归查询到对象,更不用说更多的comlex提供者,例如Linq to Entities。

用你描述的模式,你最好写一个存储过程。如果你有一个嵌套集模型,可能能够对左边缘和右边缘数字进行一些数学处理,但可能不符合那些额外的规则。