Рекурсивная функция для отображения иерархического отображения с использованием c # - PullRequest
2 голосов
/ 20 октября 2011

У меня есть такая таблица

ID               Title                    Parentid
1                Level1                    0
2                Level2                    1
3                Level3                    2 
4                Level4                    1

Я хочу вывод в иерархической модели в соответствии с отношением парентид, Id как

  • Level1
  • -> Level2-> Level 3
  • -> Level4.

Я могу достичь уровня

                      level1
                        /\
                  level2  level4. 

Здесь я не получаю уровень 3. Но яхочу выход, как показано в первом примере, используя c #.

Ответы [ 3 ]

1 голос
/ 20 октября 2011

(не проверено) Попробуйте:

;with RCTE as
(select id, title full_path from MyTable where ParentID = 0
 union all
 select m.id, r.full_path & '->' & m.title full_path
 from MyTable m, RCTE r
 where m.parentid = r.id)
select full_path from RCTE
0 голосов
/ 20 октября 2011

Рекурсия должна выполняться внутри SQL Server с использованием запроса Common Table Expression (CTE). Один запрос должен давать результаты и «уровни», которые затем могут быть проанализированы в C # без необходимости рекурсии в коде.

Вот ссылка с примерами: (пример Марка также применим)

http://msdn.microsoft.com/en-us/library/ms186243.aspx

0 голосов
/ 20 октября 2011

Все ли родители определены до детей?

Если это так, вы можете использовать Словарь (int, List (Item)) (извините за скобки, не может показатьсячтобы заставить работать угловые скобки) где, скажем,

public class Item {
    public int Id { get; set;}
    public int ParentId { get; set;}
    public string Title {get; set;}
}


IDictionary<int, List<Item>> CreateTree(IEnumerable<Item> nodeList){

    var ret = new Dictionary<int, List<Item>>();

    foreach (var item in items) {

            if (!ret.ContainsKey(item.ParentId)) {
                ret.Add(item.ParentId, new List<Item>());
            }
            ret[item.ParentId].Add(item);
        }

    return ret;
}

Это даст (для приведенных выше данных)

0 => level1

1 => level2, level4

2 => level3

Если родительские идентификаторы не гарантированы до дочерних идентификаторов, то вам нужно добавить некоторые настройки, чтобы учесть сирот, а затем добавить, а затем обработать ихв конце.

Надеюсь, это поможет,

Алан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...