2010-05-25 2 views
3

У меня есть таблица базы данных, где все записи связаны друг с другом есть что-то похожее на изображение ниже:Помощи с выражением рекурсивного LinQ

alt text http://img691.imageshack.us/img691/6772/38103866.png

Как вы можете видеть на диаграмме, запись может быть root и иметь 1 или более детей, где каждый ребенок сохраняет в свой свой ParentID свойство ID своего родителя. Мне было интересно, может ли кто-нибудь помочь мне с построением выражения LINQ, которое возвращает все узлы, начиная с последнего дочернего элемента и заканчивая корнем. Я имею в виду следующее. Начиная с Node 4 (ID = 4), я должен перейти к узлу 2 (ID = 2), затем к узлу 1, а затем к узлу 0, тем самым пропустив узел 3. Надеюсь, что я достаточно ясен, но если что-то нужно уточнить, позвольте мне знать.

ответ

3

Это будет получить работу:

static IEnumerable<Node> ListParents(IEnumerable<Node> list, int? ID) 
{ 
    var current = list.Where(n => n.ID == ID).FirstOrDefault(); 
    if (current == null) 
     return Enumerable.Empty<Node>(); 
    return Enumerable.Concat(new []{current}, ListParents(list, current.ParentID)); 
} 

Это предполагает Node класса как:

class Node 
{ 
    public int ID; 
    public int? ParentID; 
} 

Обратите внимание, что если ваши отношения ParentID вызвать цикл, эта функция будет рекурсией бесконечно.

1

Я только что нашел статьи по этому вопросу, поскольку искал информацию о запросе Linq. Они не подходят мне точно, но я считаю, что они делают то, что вы хотите.

http://www.scip.be/index.php?Page=ArticlesNET18

и он обновил этот пост в конце с ссылкой на новую статью по адресу: http://www.scip.be/index.php?Page=ArticlesNET23

Он создал методы расширения для создания иерархической коллекции из таблицы FALT с автоматическим refencing родительских колонками.

Надеюсь, они помогут, если вы все еще ищете ответы.

Смежные вопросы