如何在树形结构中获取节点的所有父节点? (Linq to Entity)

时间:2012-02-29 16:56:04

标签: linq entity-framework linq-to-entities tree

我有一个像这样的树结构表:

CREATE TABLE [dbo].[Nodes](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](max) NOT NULL,
    [ParentId] [bigint] NULL)

以最小连接查找节点路径作为父ID列表的有效方法是什么?

My Tree将不会有超过200个节点。

2 个答案:

答案 0 :(得分:0)

如果您需要允许任何级别的嵌套,这是一个非常复杂的问题。

一个解决方案是“嵌套集”,它可以减少插入,更新和删除的复杂性,从而使查询树结构更加简单/高效。

见这里:http://www.codeproject.com/Articles/4155/Improve-hierarchy-performance-using-nested-sets

如果您以这种方式设置,则检索所需数据的查询就像

SELECT [Id]
FROM [dbo].[Nodes]
WHERE [LeftExtent] < @CurrentNodeLeftExtent
AND [RightExtent] > @CurrentNodeRightExtent
ORDER BY [LeftExtent]

如果有点太多,我看到人们将路径存储为表中的一个额外列,作为逗号分隔的ID列表。显然,这意味着无论何时插入,更新或删除节点,都必须注意更新这些内容。

答案 1 :(得分:0)

我在100,000条深度为30级的记录上测试了以下解决方案。 我得到了树的所有项目,然后一个方法递归地获取路径,直到。结束条件为null父ID。大约需要4-5秒。这个持续时间是可以接受的,而树表将存储最多400个记录。