Иерархические данные в раскрывающемся списке на сайте динамических данных
Я вхожу в динамические сайты данных (удивительно мощный), и наслаждаюсь этим. Тем не менее, у меня есть требование, которое я не могу выполнить. У меня есть самостоятельная таблица категорий (Id, Name, ParentId) для создания иерархической структуры категорий (например, категории с нулевыми идентификаторами являются верхним уровнем, обычная вещь). Затем у меня есть таблица продуктов, которая имеет внешний ключ к категории.
На сайте динамических данных автоматически создается раскрывающийся список категорий; однако он просто перечисляет все категории в числовом порядке. То, что я хотел бы (и то, что я кодировал ранее, пре-динамические данные), это список с отступами, иерархически упорядоченный список категорий.
Должен ли я заменить существующий FilterUserControl? Могу ли я переопределить метод PopulateListControl в любом месте? Есть ли у кого-нибудь синтаксис LINQ для извлечения самостоятельных иерархических данных?
Только указатели и советы подойдут, спасибо за любую предложенную помощь.
С уважением,
Майк Кингскотт
2 ответа
В Oracle:
SELECT LEVEL, Id, Name, LPAD(' ', LEVEL) || Name AS IndentedName
FROM Categories
START WITH
ParentID IS NULL
CONNECT BY
ParentID = PRIOR Id
ORDER SIBLINGS BY
Name
Вы можете использовать IndentedName
или сделать пользовательское форматирование на основе LEVEL
псевдостолбец (показывает глубину каждой категории)
PS Это bad
идея использовать NULL
в качестве верхнего родительского идентификатора, так как вы не можете использовать индекс для доступа к нему. Использовать 0
вместо.
Обновить:
В SQL Server
:
WITH q (id, parentid, name, level, bc) AS
(
SELECT id, parentid, name, 1, CAST(ROW_NUMBER() OVER (ORDER BY name) AS VARCHAR(MAX))
FROM Categories
WHERE ParentID IS NULL
UNION ALL
SELECT c.id, c.parentid, c.name, q.level + 1, q.bc + '.' + CAST(ROW_NUMBER() OVER (ORDER BY c.name) AS VARCHAR(MAX))
FROM q
JOIN Categories c
ON c.parentId = q.id
)
SELECT *
FROM q
ORDER BY
bc
В отличие от Oracle
, SQL Server
индексы NULL
значения, так что можно использовать NULL
чтобы отметить конечного предка.
SQL Server имеет иерархический тип данных. Не использовал это, но выглядит интересно. http://msdn.microsoft.com/en-us/magazine/cc794278.aspx.
То, что я часто использую в этих ситуациях, это левое правое дерево. Они эффективны для запроса данных. Самое главное, у меня есть определенный слой для загрузки и сохранения моего дерева. Это позволит получить всех детей из базы данных и загрузить дерево в память. Слой также будет отвечать за перемещение узлов внутри дерева, удаление узлов и т. Д. Как только у вас есть дерево, организованное в памяти, вы можете делать все оттуда. Надеюсь, это поможет, дайте мне знать, если вам нужны примеры кода общего дерева слева / справа.