Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取linq到实体查询中的子项计数_C#_Linq To Entities - Fatal编程技术网

C# 获取linq到实体查询中的子项计数

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

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

  • 类别(id、名称、id\u父项)
  • 声音(id、姓名)
一个类别可以有一个父类别,因此一个类别可以有多个子类别。如果一个类别至少有一个子类别,则该类别中没有声音。我不允许将声音和儿童类别放在一起

对于父类,我想得到所有可能有子类的子类,可能有子类(…),我想递归地计算所有子类中的声音

例如:

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

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

  • 这只猫有三个孩子
  • 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级子体的情况。不过,您可以使用递归函数来修复它。让我再告诉你:)