2010-12-08 85 views
2

我有一個表有一個Id和parentId列。 ParentId包含表中另一行的ID。如果ParentId爲空,則它是層次結構的頂部。當id和父母id在同一個表中時,我可以選擇父母的完整層次結構嗎?

我有一行的ID,我想選擇層次結構中的所有行。我可以在單一選擇中做到這一點嗎?

所以在這個例子中:

Id | parentId |其他欄目
1 | null
2 | 1
3 | 2

如果我有id = 3我想選擇行1,2,3。

我可以在linq中執行sql嗎?

回答

2

您可以使用recursive CTE在單個選擇中執行此操作,但是LINQ to SQL不支持此操作,因此您必須使用查詢創建存儲過程並將其從LINQ調用到SQL。

1

不知道LINQ,但其他應答者已經寫了,很多關係數據庫支持通用表表達式(CTE) - 但不是所有(甲骨文想到的)。如果得到支持,CTE是一種檢索「血統」的好方法。

請注意,還有其他一些方法要考慮特別是橋表或嵌套集。 See my question for some explanation of these options和表示分層數據的其他方式。簡而言之,最有可能使用觸發器的CTE更新的橋表很容易給你所有的祖先或後代 - 只是沒有多大的距離。一個嵌套集模型會給你這個信息,並且以更昂貴的插入和相對更新爲代價。