Как получить данные древовидной таблицы по linq? - PullRequest
1 голос
/ 23 марта 2009

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

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

Я хочу получить все поддерево под корневым узлом. Когда моим корневым узлом является «x», я хочу получить набор узлов {1, 5, 6, 7, 10, 11, 12}. Как я могу сделать это по linq?

Ответы [ 3 ]

1 голос
/ 23 марта 2009

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

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,")
0 голосов
/ 18 октября 2011

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

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

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

Спасибо

0 голосов
/ 27 апреля 2009
    /// <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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...