Как получить дерево структурированные данные таблицы по LINQ?

голоса
1

У меня есть таблица, которая имеет структуру дерева сама по себе.

Id ParentId Name
----------------
1    null   x
2    null   y
3    null   z
4    null   t
5     1     xx
6     1     xy
7     1     xz
8     2     yx
9     2     yy
10    9     yyx
11    10    yyxx
12    11    yyxxx

Я хочу, чтобы получить весь суб-дерево в корневом узле. Когда мой корневой узел х Я хочу, чтобы получить множество узлов {1, 5, 6, 7, 10, 11, 12}. Как я могу это сделать с помощью LINQ?

Задан 23/03/2009 в 07:05
источник пользователем
На других языках...                            


3 ответов

голоса
1

Если вы в состоянии Изменение структуры таблицы, чтобы добавить дополнительные поля, то один подход, который я использовал в прошлом, чтобы иметь поле «Path», который содержит разделенный запятыми список идентификаторов.

ID    ParentID    Name      Path
--    --------    ----      ----
1     null        x         1
2     null        y         2
3     null        z         3
4     null        t         4
5     1           xx        1,5
6     1           xy        1,6
7     1           xz        1,7
8     2           yx        2,8
9     2           yy        2,9
10    9           yyx       2,9,10
11    10          yyxx      2,9,10,11
12    11          yyxxx     2,9,10,11,12

Тогда вы можете запросить на основе поля Path, используя LIKE (или StartsWith в Linq)

В своем вопросе вы говорите, что хотите получить {1, 5, 6, 7, 10, 11, 12}, но эти идентификаторы являются частью двух различных поддеревьев, если я прочитал это правильно.

Для того, чтобы получить «х» и все это дети ...

where Path = "1" || Path.StartsWith("1,")

Для того, чтобы просто получить ребенок иксов ...

where Path.StartsWith("1,")
Ответил 23/03/2009 в 08:03
источник пользователем

голоса
0
    /// <summary>
    /// Allows to recursively select descendants as plain collection
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="source"></param>
    /// <param name="DescendBy"></param>
    /// <returns></returns>

    public static IEnumerable<T> Descendants<T>(
        this IEnumerable<T> source, Func<T, IEnumerable<T>> DescendBy)
    {
        foreach (T value in source)
        {
            yield return value;

            foreach (var child in DescendBy(value).Descendants(DescendBy))
            {
                yield return child;
            }
        }
    }

использование: node.children.Descendants (узел => node.children);

Ответил 27/04/2009 в 07:58
источник пользователем

голоса
0

Вы должны выполнить внутреннее соединение в Linq с помощью таблицы Самой следующим образом:

from root in TableName 
join subnodes in TableName on root.Id equals subnodes.ParentId
select new { Name }

Это позволит получить все те записи, которые родитель Совпадение ID с Id с таким же столом, переименованным в подузлах

благодаря

Ответил 18/10/2011 в 09:40
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more