1

Я использовал принятый ответ на вопрос Hierarchical data in Linq - options and performance, чтобы запросить иерархическую таблицу для всех потомков конкретной записи/узла. Теперь мне нужно найти корень дерева, в котором определенный узел является потомком. Как я могу использовать как можно более возможное решение в качестве принятого для этого ответа?Как найти корень иерархии с помощью LINQ и EF?

Иерархия представлена ​​таблицей саморегуляции с столбцом ParentId, который является нулевым для верхнего элемента в иерархии.

ответ

0

ли это такая вещь, что вы ищете

CREATE TABLE [dbo].[hierarchical_table](
    [id] INT, 
    [parent_id] INT, 
    [data] VARCHAR(255) 
) 
GO 

INSERT [dbo].[hierarchical_table] 
SELECT 1,NULL,'/1' UNION ALL 
SELECT 2,1,'/1/2' UNION ALL 
SELECT 3,2,'/1/2/3' UNION ALL 
SELECT 4,2,'/1/2/4' UNION ALL 
SELECT 5,NULL, '/5' UNION ALL 
SELECT 6,5,'/5/6' 
GO 

CREATE FUNCTION [dbo].[fn_root_for_node] 
(
    @id int 
) 
RETURNS TABLE AS 
RETURN (
    WITH [hierarchy_cte](id, parent_id, data, [Level]) AS 
    (
     SELECT 
      id, 
      parent_id, 
      data, 
      0 AS [Level] 
     FROM dbo.hierarchical_table 
     WHERE id = @id 
     UNION ALL 
     SELECT t1.id, t1.parent_id, t1.data, h.[Level] + 1 AS [Level] 
     FROM dbo.hierarchical_table AS t1 
     INNER JOIN hierarchy_cte AS h 
      ON t1.id = h.parent_id 
    ) 
    SELECT TOP 1 
     id, parent_id, data, [Level] 
    FROM [hierarchy_cte] 
    ORDER BY [Level] DESC 
) 
GO 

SELECT * FROM [dbo].[fn_root_for_node] (6) 
GO 
+0

Пятно на, вплоть до точных строк кода, спасибо. – ProfK