получение вложенных результатов из linq в sql - PullRequest
2 голосов
/ 03 марта 2009

мои данные в таблице выглядят так:

ID     Name     Parent ID
---    ----     ---------
1      Mike     null
2      Steve    1
3      George   null
4      Jim      1

Я не могу понять, как написать запрос linq to sql, который будет возвращать результаты с родительскими строками, сгруппированными с их дочерними строками. Так, например, это результат, который я хочу:

1 Mike (no parent)
   2 Steve (Parent is 1)
   4 Jim (Parent is 1)
3 George (no parent)

То, как я сейчас это делаю, - это сначала получить набор результатов всех родительских строк. Затем я перебираю его, нахожу дочерние элементы для каждого родителя и вставляю все это в список <>, пока я зацикливаюсь. В конце список <> имеет все в том порядке, в котором я хочу.

Но есть ли способ сделать это только одним запросом linq?

Ответы [ 2 ]

2 голосов
/ 03 марта 2009

Предполагая, что у вас есть самоссылочная связь для таблицы, вы можете сделать что-то вроде:

 var q = db.People
           .OrderBy( p => p.ParentID == null
                          ? p.Name
                          : p.Parent.Name + ":" + p.ID + ":" + p.Name );
1 голос
/ 03 марта 2009

Вам необходимо Общее табличное выражение (CTE) для выполнения рекурсивного SQL . CTE не поддерживаются Linq to Sql. Вы можете выполнить запрос напрямую , хотя.

Вот как может выглядеть SQL, хотя он не группирует детей с их родителями. Я не думаю, что вы можете сделать группировку, используя CTE:

WITH DirectReports (ID, Name, ParentID, Level)
AS
(
    SELECT e.ID, e.Name, e.ParentID, 0 AS Level
    FROM Employee e
    WHERE e.ParentID IS NULL

    UNION ALL

    SELECT e.ID, e.Name, e.ParentID, Level + 1
    FROM Employee E
    JOIN DirectReports AS d
    ON e.ParentID = d.ID
)
SELECT *
FROM DirectReports
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...