Как насчет этого?
Таблица =>
Id
ParentId
Имя
Хороший простой стол?
Тогда как насчет какой-нибудь хорошей сложной части SQL? (CTEs рок, я думаю)
public object FetchCategoryTree()
{
var sql = @"SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
WITH AreaTree (ID, Name, ParentID, OrgLevel, SortKey) AS
(
-- Create the anchor query. This establishes the starting
-- point
SELECT
a.ID,
cast('---- ' + a.Name as varchar(255)),
a.ParentID,
cast('----' as varchar(55)),
CAST(a.ID AS VARBINARY(900))
FROM dbo.Area a
WHERE a.ParentID is null
UNION ALL
-- Create the recursive query. This query will be executed
-- until it returns no more rows
SELECT
a.ID,
cast('----' + b.OrgLevel + ' ' + a.Name as varchar(255)),
a.ParentID,
cast(b.OrgLevel+ '----' as varchar(55)),
CAST(b.SortKey + CAST (a.ID AS BINARY(4)) AS VARBINARY(900))
FROM dbo.Area a
INNER JOIN AreaTree b ON a.ParentID = b.ID
)
SELECT * FROM AreaTree
ORDER BY SortKey";
return FetchObject(sql);
}
Теперь это делает магию SQL, в которой я не слишком уверен. Однако, с точки зрения непрофессионала, он в основном принимает первую часть в качестве корневого запроса. Затем он возвращается к таблице и выполняет вторую часть, используя ответ первой части через объединение, и продолжает делать, пока не может найти больше совпадений, в основном большой цикл. Это также довольно быстро.
Вы получите кучу строк с прикрепленным ключом сортировки. Заказав запрос по ключу сортировки, вы получите ответ, подобный следующему:
---- parent 1
-------- child 1
-------- child 2
------------ child 2.1
---- parent 2
-------- etc
Может быть, то, что вы ищете?