从linq获取嵌套结果到sql

时间:2009-03-03 15:00:54

标签: sql-server linq linq-to-sql

我的数据在表格中如下所示:

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

我无法弄清楚如何将linq写入sql查询,该查询将返回带有子行的父行的结果。例如,这就是我想要的结果:

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

我现在正在做的方法是首先获取所有父行的结果集。然后我遍历它并找到每个父项的子项并将所有这些插入List<>因为我循环。最后,List<>拥有我想要的一切。

但有没有办法在一个linq查询中执行此操作?

2 个答案:

答案 0 :(得分:2)

假设您有一个表的自引用关系,您可以执行以下操作:

 var q = db.People
           .OrderBy( p => p.ParentID == null
                          ? p.Name
                          : p.Parent.Name + ":" + p.ID + ":" + p.Name );

答案 1 :(得分:1)

您需要Common Table Expression (CTE) to do recursive SQL。 Linq to Sql不支持CTE。你可以execute a query directly

这就是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