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

时间:2012-03-12 09:16:13

标签: c# vb.net linq linq-to-entities linq-to-objects

我想知道是否有一个简洁的方法做到这一点,不要使用任何类型的while循环或类似的,最好是针对Linq to Entities作为单个SQL往返运行,并且还针对Linq To对象。

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

我在此之后是一种从Posts的树中获取所有Forums的方法 - 即所讨论的Forum,以及它的所有孩子,孙子等等。事先不知道Forum可能有多少子级别。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

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