C# 获取linq到实体查询中的子项计数
我的数据库(MySql)中的两个表之间存在多对多关系:C# 获取linq到实体查询中的子项计数,c#,linq-to-entities,C#,Linq To Entities,我的数据库(MySql)中的两个表之间存在多对多关系: 类别(id、名称、id\u父项) 声音(id、姓名) 一个类别可以有一个父类别,因此一个类别可以有多个子类别。如果一个类别至少有一个子类别,则该类别中没有声音。我不允许将声音和儿童类别放在一起 对于父类,我想得到所有可能有子类的子类,可能有子类(…),我想递归地计算所有子类中的声音 例如: Cat->(CCat1->CCCat11(2个声音)、CCat2(5个声音)、CCat3->CCat31->CCCat311->(CCCCat311
- 类别(id、名称、id\u父项)
- 声音(id、姓名)
- 这只猫有三个孩子
- CCat1有一个孩子
- CCat2没有孩子
- CCat3有一个孩子有一个孩子有两个孩子
Cat.nbSounds=18答案取决于
SelectMany
操作符的用户
int count_soundsinparent = parentCategory
.Select(x=> x.ChildCategory)
.SelectMany(x=> x.Sounds)
.Count();
假设您使用了一个常规的Select
;它将返回一个声音列表(每个子类别一个项目)的列表(每个子类别有一个项目),从而创建一个二维列表
SelectMany
所做的是将该列表中的所有元素放入一个一维列表中。然后计算该列表中的项目,瞧,就得到了总数。答案取决于SelectMany
操作符的用户
int count_soundsinparent = parentCategory
.Select(x=> x.ChildCategory)
.SelectMany(x=> x.Sounds)
.Count();
假设您使用了一个常规的Select
;它将返回一个声音列表(每个子类别一个项目)的列表(每个子类别有一个项目),从而创建一个二维列表
SelectMany
所做的是将该列表中的所有元素放入一个一维列表中。然后你计算该列表中的项目,瞧,你得到了总数
递归地
这一要求意味着您不需要在单个LINQ查询中实现它。LINQ不能真正用LINQ to对象表示递归查询,更不用说像LINQ to Entities这样更复杂的提供程序了
使用您描述的模式,您最好编写一个存储过程。如果您有一个嵌套的集合模型,您可能能够对左边缘和右边缘数字进行一些数学操作,但可能无法使用这些额外的规则
递归地
这一要求意味着您不需要在单个LINQ查询中实现它。LINQ不能真正用LINQ to对象表示递归查询,更不用说像LINQ to Entities这样更复杂的提供程序了
有了您描述的模式,您最好编写一个存储过程。如果您有一个嵌套的集合模型,您可能能够对左边缘和右边缘的数字进行一些数学处理,但可能无法使用这些额外的规则。经过更多的研究,我们似乎无法做到我想要的 因此,我创建了一个递归方法来检索子类并计算每个类别中的声音数(我计算类别中的声音数或我计算类别子类的声音数)
如果你找到了一种神奇的方法,用linq来实现实体,我相信!经过更多的研究,我们似乎无法实现我想要的 因此,我创建了一个递归方法来检索子类并计算每个类别中的声音数(我计算类别中的声音数或我计算类别子类的声音数)
如果你找到了一种神奇的方法来使用linq to entities,我相信!如果你是从数据库中获取此信息,你应该尝试创建一个存储过程。否则,你将不得不向客户端发送大量信息,使用存储过程,你只需发送最后的数字。@MrFox:如果你可以创建一个linq查询t如果hat返回此数据,则不会向客户端发送“大量信息”。我觉得在这种情况下,单次LINQ查询无法解决问题。我的第一个想法是编写一个递归方法来查找子类别并从中返回计数…但这反过来又会导致大量查询。如果您从数据库中获取此信息,则应尝试创建一个存储过程。否则,您将不得不发送大量数据使用存储过程,您只需向客户端发送最终编号。@MrFox:如果您可以创建一个LINQ查询来返回此数据,则您不会向客户端发送“大量信息”。我觉得在这种情况下,单个LINQ查询无法解决问题。我的第一个想法是编写一个递归方法来查找子类别并从中返回计数…但这反过来又会导致大量查询。我无法尝试此操作,因为我需要先获取所有子类别,所以我编辑了我的帖子:)你确定有了这个请求,我就能听到所有的声音了吗?因为在childcategory我可以在Tooya有孩子我注意到太晚了。这仅适用于只有1级子体的情况。不过,您可以使用递归函数来修复它。让我回复你:)我不能尝试这个,因为我需要在之前得到所有的孩子,所以我编辑了我的帖子:)你确定通过这个请求我得到了所有的声音吗?因为在childcategory我可以在Tooya有孩子我注意到太晚了。这仅适用于只有1级子体的情况。不过,您可以使用递归函数来修复它。让我再告诉你:)