LINQ - 在父子层次结构中选择“全部”

本文关键字:选择 全部 层次结构 父子 LINQ | 更新日期: 2023-09-27 18:27:32

我想知道是否有一种巧妙的方法,不使用任何类型的 while 循环或类似方法,最好是针对 Linq 到实体作为单个 SQL 往返运行,也针对 Linq To Objects。

我有一个实体 - Forum - 正在进行父子关系。也就是说,一个Forum可能(或者在顶层的情况下,可能没有(有ParentForum,并且可能有很多ChildForums。然后,Forum包含许多Posts

我在这里追求的是一种从Forums树上获取所有Posts的方法——即有问题的Forum,以及所有的孩子、孙子孙女等。我事先不知道有问题的Forum可能有多少个子级别。

(注意 - 我知道这个例子不一定是一个有价值的用例,但论坛对象模型一是大多数人都熟悉的,因此作为一个通用且可访问的前提,而不是我的实际领域模型。

LINQ - 在父子层次结构中选择“全部”

一种可能的方法是使用左/右树存储实际数据表(此处的示例:http://www.sitepoint.com/hierarchical-data-database-2/. 请注意,该示例在 MySQL/PHP 中,但实现起来很简单(。 使用它,您可以找出属于父级左/右值的所有论坛,并在此基础上,您可以检索论坛ID IN这些论坛ID的所有帖子。

我相信

你可能会得到一些关于Linq查询的正确答案。 当涉及到SQL方面的事情时,我将其作为建议发布。

我在SQL中的虚拟文件系统上遇到了类似的问题。 我需要能够递归查询文件夹中的文件 - 当然,文件夹具有递归父子关系。 我还需要它快速,我当然不想回到客户端处理。

为了提高性能,我最终编写了存储过程和内联函数 - 不幸的是,在这里发布太复杂了(我可能会因为共享公司代码而受到解雇! 然而,关键是学习如何使用递归 CTE http://msdn.microsoft.com/en-us/library/ms186243.aspx。 我花了几天时间才确定它,但性能令人难以置信(尽管它们很容易出错 - 所以请注意查询计划(。