Возможно, я бы использовал UDF / CTE или (для очень глубоких структур) хранимую процедуру, которая делает то же самое вручную.
Обратите внимание, что если вы можете изменить схему, вы можете предварительно индексировать такие рекурсивные структуры в индексированное / ранжированное дерево, которое позволяет выполнить один запрос BETWEEN, но обслуживание дерева обходится дорого (то есть запрос становится дешевым, но вставка / обновление / удаление становятся дорогими, или вам нужно отложенное запланированное задание).
Re 2 - вы можете только yield
тип, указанный в перечислении (T
in IEnumerable<T>
/ IEnumerator<T>
).
Вы можете yield
и IEnumerable<Comment>
, если метод вернул IEnumerable<IEnumerable<Comment>>
- имеет ли это смысл?
Улучшения:
- возможно udf (для сохранения компоновки, а не хранимой процедуры), который использует подход рекурсии CTE
- использовать
using
, поскольку DataContext
равно IDisposable
...
так:
using(var db = new MyDataContext() ) { /* existing code */ }
- LoadWith стоит попробовать, но я не уверен, что буду полон надежд ...
- список найденных идентификаторов является рискованным как поле - я думаю, что вы в порядке, если вы не вызываете его дважды ... лично, я бы использовал аргумент для частного метода поддержки ... ( т.е. передать список между рекурсивными вызовами, но не в общедоступном API)