Поместить результаты linq в sql в иерархическую структуру для использования в неупорядоченном списке (для дерева jquery)

2

У меня есть 5 таблиц в классах L2S dbml: Global → Категории → Подкатегория → Элемент → Данные элемента. Я хочу иметь возможность перемещаться из таблицы Global вниз по дереву, подобному структуре, чтобы перейти к элементам - отобразить заголовок из таблицы данных элемента.

У меня есть существующий элемент управления, который использует расширенный набор IHierarchyData/IHierarchicalEnumerable, итерируя по коллекции для вывода неупорядоченного списка, который затем я превращаю в дерево с jquery. Я сделал это на основе Возвращает Un-Ordered List из иерархических данных sql

Есть ли простой общий способ, который я мог бы использовать, чтобы поместить данные из приведенной выше структуры таблицы в иерархическую структуру, чтобы я мог повторно использовать мой существующий элемент управления и просто пройти в другой коллекции.

Теги:
tree
hierarchical-data
linq-to-sql

4 ответа

1

Вы пробовали Вложенные списки просмотров? Я реализовал это решение на нескольких страницах. Я использую ObjectDataSources вместо LinqDataSources напрямую, чтобы поддерживать логику данных отдельно, но вложенные EntitySets работают красиво.

0

Так как вы имеете дело с различными типами в этом случае, вам придется реализовать общий интерфейс для каждого из них, чтобы сделать общий код. Основной подход заключался бы в создании интерфейса, который включает любые необходимые свойства (например, DisplayText, ActionURL и т.д.), А затем рекурсивно перебирает коллекцию.

Вот пример:

 public interface IDataItem
    {
        string DisplayText { get; }
        string ActionUrl { get;  }
        bool HasChildren { get; }
        IEnumerable<IDataItem> GetChildren();
    }

 public void CreateTree(HtmlTextWriter writer, IEnumerable<IDataItem> collection)
    {
        writer.WriteFullBeginTag("ul");
        foreach (var data in collection)
        {
            writer.WriteFullBeginTag("li");
            writer.WriteBeginTag("a");
            writer.WriteAttribute("href",data.ActionUrl);
            writer.Write(HtmlTextWriter.TagRightChar);
            writer.Write(data.DisplayText);
            writer.WriteEndTag("a");
            if(data.HasChildren)
                CreateTree(writer, data.GetChildren());
            writer.WriteEndTag("li");
        }
        writer.WriteEndTag("ul");
    }

Вам нужно будет реализовать интерфейс для каждого из ваших типов, который вы хотите включить в treeview. Простое совпадение в коллекции типа верхнего уровня и вышеописанного метода спустится по иерархии, создав необходимый вложенный список.

0

Вы можете использовать оператор Union, чтобы объединить ваши четыре таблицы вместе. http://weblogs.asp.net/zeeshanhirani/archive/2008/04/11/union-operator-part-12.aspx

  • 0
    @ Роберт: Используя эту концепцию, я бы не закончил с элементами в коллекции, где primaryID и parentID перекрываются, так сказать? Мои глобальные ключи в некоторых случаях будут такими же, как ключи категорий, потому что каждая таблица в моей структуре использует тождественное начальное число, которое начинается с 1?
  • 0
    Итак, мы снова вернемся к дизайну с одной таблицей, если вы не хотите использовать GUID для своих первичных ключей в каждой таблице.
Показать ещё 3 комментария
0

Я думаю, что вы повесили, что вам не нужны четыре таблицы для этого.

Посмотрите снова вернуть неупорядоченный список из иерархических данных sql. Там нет четырех таблиц. Там только один.

  • 0
    Правда, и я реализовал это решение для одного дерева, в котором у меня есть данные с самообращением, как в этой таблице решений. Для моей проблемы я хочу другое дерево, где я хочу в основном развернуть 4 отдельные таблицы, чтобы попасть в элемент.
  • 0
    Я отредактировал вопрос, чтобы, надеюсь, сделать его более понятным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню