LINQ - 选择父子层次结构中的所有内容

3
我想知道是否有一种简洁的方法来实现这个功能,而不使用任何while循环或类似的东西,最好能够运行Linq to Entities作为单个SQL回传,并且也可以运行Linq To Objects。
我有一个实体 - Forum - 它具有父子关系。也就是说,一个Forum可能(或在顶层的情况下可能不)有一个ParentForum,并且可能有许多ChildForums。然后,一个Forum包含许多帖子。
我想要的是从Forum树获取所有的帖子 - 也就是所涉及的Forum和它的所有子代,孙子等。我不知道所涉及的Forum可能有多少子级。
(注意 - 我知道这个例子不一定是一个有价值的用例,但Forum对象模型是大多数人熟悉的,因此作为一个通用和易于访问的前提条件,而不是我的实际领域模型。)

你可能会发现这个回答https://dev59.com/BFTTa4cB1Zd3GeqPw-_u有用。如果我理解问题不正确,我很抱歉。如果你最初调用GetChildrenMethod,你只需要一次对数据库的调用。 - Krishna
1
相关:https://dev59.com/UFDTa4cB1Zd3GeqPKpwj - Gert Arnold
2个回答

1

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


有趣...当您更改结构时会发生什么?那么您会重建左/右树吗? - RichardW1001
@RichardW1001,是的,你需要进行一系列更新。通常情况下没有问题,除非你有一个非常庞大的层次结构,但在论坛和子论坛的情况下,我不认为性能会成为一个特别的问题。 - Moo-Juice

1

我相信你可能会得到一些关于Linq查询的正确答案。我在这里发布这篇文章是为了提醒大家SQL方面的问题。

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

为了性能,我最终编写了存储过程和内联函数 - 不幸的是,它们太复杂了,无法在此处发布(而且我可能因共享公司代码而被解雇!)。然而,关键是要学习如何使用递归CTE http://msdn.microsoft.com/en-us/library/ms186243.aspx。我花了几天时间才掌握它,但性能非常好(但很容易出错 - 因此请注意查询计划)。


以前从未听说过递归CTE,谢谢分享,我会去了解一下的。 - RichardW1001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接