我有一个表,其中包含Id和parentId的列。 ParentId包含表中另一行的Id。如果ParentId为null,则它是层次结构的顶部。
我有一行的Id,我想在层次结构中选择它上面的所有行。我可以一次性选择吗?
所以在这个例子中:
Id | parentId |其他栏目
1 |空
2 | 1
3 | 2
如果我有id = 3我想选择行1,2,3。
我可以在linq中使用sql吗?
答案 0 :(得分:2)
您可以使用recursive CTE在单个选择中执行此操作,但是LINQ to SQL不支持此操作,因此您必须使用查询创建存储过程并将其从LINQ调用到SQL。
答案 1 :(得分:1)
查看 this example ,使用递归CTE。
答案 2 :(得分:1)
不知道LINQ,但正如其他回答者所写,许多关系数据库支持公用表表达式(CTE) - 但不是全部(Oracle会想到)。如果支持,CTE是检索“祖先”的好方法。
注意到,还有一些其他方法需要考虑特别是桥接表或嵌套集。 See my question for some explanation of these options以及表示分层数据的其他方式。简而言之,最有可能使用CTE从触发器更新的桥接表很容易为您提供所有祖先或后代 - 只是没有接近。嵌套集模型将为您提供此信息,以及相对于更昂贵的插入和更新的代价。