Иерархические данные в раскрывающемся списке на сайте динамических данных

Я вхожу в динамические сайты данных (удивительно мощный), и наслаждаюсь этим. Тем не менее, у меня есть требование, которое я не могу выполнить. У меня есть самостоятельная таблица категорий (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.

То, что я часто использую в этих ситуациях, это левое правое дерево. Они эффективны для запроса данных. Самое главное, у меня есть определенный слой для загрузки и сохранения моего дерева. Это позволит получить всех детей из базы данных и загрузить дерево в память. Слой также будет отвечать за перемещение узлов внутри дерева, удаление узлов и т. Д. Как только у вас есть дерево, организованное в памяти, вы можете делать все оттуда. Надеюсь, это поможет, дайте мне знать, если вам нужны примеры кода общего дерева слева / справа.

Другие вопросы по тегам