我的数据在表格中如下所示:
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查询中执行此操作?
答案 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