Скажем, у вас есть следующий CTE, который возвращает уровень некоторых данных дерева (модель смежности), которые у меня есть (взяты из Иерархические данные в Linq - параметры и производительность):
WITH hierarchy_cte(id, parent_id, data, lvl) AS
(
SELECT id, parent_id, data, 0 AS lvl
FROM dbo.hierarchical_table
WHERE (parent_id IS NULL)
UNION ALL
SELECT t1.id, t1.parent_id, t1.data, h.lvl + 1 AS lvl
FROM dbo.hierarchical_table AS t1
INNER JOIN hierarchy_cte AS h ON t1.parent_id = h.id
)
SELECT id, parent_id, data, lvl
FROM hierarchy_cte AS result
Мне было интересно, можно ли повысить производительность, выполнив рекурсию на C # вместо SQL. Может ли кто-нибудь показать мне, как выполнять ту же работу, которую CTE выполняет с рекурсивной функцией C #, предполагая, что у меня есть IQueryable, где Tree - это объект, представляющий запись в иерархической таблице? Что-то вроде:
public void RecurseTree(IQueryable<Tree> tree, Guid userId, Guid parentId, int level)
{
...
currentNode.level = x
...
Recurse(tree... ,level + 1)
}
Было бы здорово увидеть, что это легко сделать с помощью лямбда-выражения.