Я пытаюсь построить цепочку, основанную на отношениях родитель / потомок в таблице базы данных SQL. Я делал это в прошлом, но сейчас мне нужно пройтись по иерархии снизу вверх (назад).
Вот как выглядит мой DataTable:
DocID | ParentDocID | Имя
7 | 0 | Изображения (Root)
24 | 7 | JPG (Уровень 2)
34 | 24 | Размер (Уровень 3)
Так что это N-уровневая архитектура. Я всегда знаю, на каком уровне я нахожусь через строковую переменную запроса. Мне нужно зациклить снизу вверх, чтобы пользователь мог отметить, на каком уровне структуры уровня они находятся. У меня проблемы с выяснением этого. Я не могу использовать сессию или viewstate.
Желаемые результаты:
Пользователь переходит по этой ссылке:
Default.aspx? DocId = 34 - тогда они видят след крошки как таковой:
Home > Изображения > JPG > Размер
Default.aspx? DocId = 24 - Тогда они видят след крошки как таковой:
Home > Изображения > JPG
Элемент «Дом», который я жестко запрограммировал. Мне также нужно, чтобы каждый элемент в трейле связывался, за исключением уровня, на котором вы находитесь.
Я бы предпочел, чтобы это было сделано в коде C #. Я также открыт для параметров хранимой процедуры уровня SQL.
Любая помощь будет принята с благодарностью. Заранее спасибо!
Вот некоторый SQL, который я пытаюсь, но не получаю нужные мне результаты. Надеюсь, это поможет:
WITH Hierachy([DocID], [ParentDocID], [Name], [Level]
AS
(
SELECT [DocID], [ParentDocID], [Name], 0 AS [Level]
FROM [Documents] d
WHERE (d.[ParentDocID] = 7) AND ([Folder] = 1) AND ([Status] = 'A') AND ([AppGroupID] = 4)
UNION ALL
SELECT d.[DocID], d.[ParentDocID], d.[Name], dh.[Level] + 1
FROM [Documents] d
INNER JOIN Hierachy dh
--ON d.ParentDocID = dh.DocID
ON dh.[ParentDocID] = d.[DocID] -- bottom up apporach
WHERE ([Folder] = 1) AND ([Status] = 'A') AND ([AppGroupID] = 4)
)
SELECT [DocID], [ParentDocID], [Name]
FROM Hierachy
--WHERE [Level] > 0
Я понял! Вот SQL, который работает:
WITH Hierachy([DocID], [ParentDocID], [Name], [Level])
AS
(
SELECT [DocID], [ParentDocID], [Name], 0 AS [Level]
FROM [Documents] d
WHERE (d.[DocID] = @ParentDocID) AND ([Folder] = 1)
AND ([Status] = 'A') AND ([AppGroupID] = @AppGroupID)
UNION ALL
SELECT d.[DocID], d.[ParentDocID], d.[Name], dh.[Level] + 1
FROM [Documents] d
INNER JOIN Hierachy dh
ON dh.[ParentDocID] = d.[DocID]
WHERE ([Folder] = 1)
AND ([Status] = 'A') AND ([AppGroupID] = @AppGroupID)
)
SELECT [DocID], [ParentDocID], [Name]
FROM Hierachy
ORDER BY [Level] DESC
)