Могу ли я выбрать полную иерархию родителей, когда идентификатор и идентификатор родителя находятся в одной таблице? - PullRequest
2 голосов
/ 09 декабря 2010

У меня есть таблица, в которой есть столбец для Id и parentId.ParentId содержит идентификатор другой строки в таблице.Если ParentId равен нулю, то это верхняя часть иерархии.

У меня есть идентификатор строки, и я хочу выбрать все строки над ним в иерархии.Могу ли я сделать это за один выбор?

, поэтому в этом примере:

Id |parentId |другие столбцы
1 |нуль
2 |1
3 |2

если у меня id = 3, я хочу выбрать строки 1,2,3.

Можно ли сделать это в linq to sql?

Ответы [ 3 ]

2 голосов
/ 09 декабря 2010

Вы можете сделать это за один выбор, используя рекурсивный CTE , однако LINQ to SQL не поддерживает это, поэтому вам придется создать хранимую процедуру с запросом и вызывать ее из LINQ to SQL..

1 голос
/ 09 декабря 2010

Не знаю LINQ, но, как написали другие авторы, многие реляционные базы данных поддерживают Common Table Expressions (CTE) - но не все (Oracle приходит на ум). И если поддерживается, CTE является хорошим подходом к поиску «предков».

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

1 голос
/ 09 декабря 2010

Взгляните на этот пример , использует рекурсивный CTE.

...