Рекурсивный выбор через LINQ?

Возможный дубликат:
Рекурсивный запрос linq to sql

Я застрял в создании рекурсивного выбора через LINQ для собственной таблицы ссылок.

введите описание изображения здесь

Я использую этот class:

public class DivisionHierarchy { public Division Division { get; set; } public IEnumerable Divisions { get; set; } } 

и я создал эту функцию, но как-то она бесконечна.

 public IEnumerable GetDivisionHierarchy(IEnumerable allDivisions, Division parentDivision) { Guid? parentDivisionId = null; if (parentDivision != null) parentDivisionId = parentDivision.DivisionID; var childDivisions = allDivisions.Where(e => e.DivisionID == parentDivisionId); Collection hierarchy = new Collection(); foreach (var div in childDivisions) hierarchy.Add(new DivisionHierarchy() { Division = div, Divisions = GetDivisionHierarchy(allDivisions, div) }); return hierarchy; } 

Любая подсказка, где я могу начать?

Спасибо!

PS Есть ли другие способы сделать это?


ОБНОВЛЕНИЯ на основе http://www.scip.be/index.php?Page=ArticlesNET18#AsHierarchy

Я нашел свои ошибки.

Существует два способа реализовать: 1. Корневой узел должен быть создан в базе данных.

введите описание изображения здесь

  1. Я немного изменил код.

     Guid divisionID = Guid.Parse("5b487b3d-e9be-413f-b611-2fd7491e0d0d"); // Hardcoded somehow var rootDivision = db.Divisions.Where(i => i.ID == divisionID).FirstOrDefault(); var divisionHierarchy = GetDivisionHierarchy(db.Divisions.AsEnumerable(), rootDivision); 

      public IEnumerable GetDivisionHierarchy(IEnumerable allDivisions, Division parentDivision) { Guid? parentDivisionId = null; if (parentDivision != null) parentDivisionId = parentDivision.ID; var childDivisions = allDivisions.Where(division => division.DivisionID == parentDivisionId); Collection hierarchy = new Collection(); foreach (var div in childDivisions) { DivisionHierarchy divisionHierarchy = new DivisionHierarchy(); divisionHierarchy.Division = div; divisionHierarchy.Divisions = GetDivisionHierarchy(allDivisions, div); hierarchy.Add(divisionHierarchy); } return hierarchy; } 

Я бы загрузил деления нерекурсивным образом, а затем настроил рекурсивные отношения в коде. Вот пример, который делает это ленивым способом

 public class Division { public int ID { get; set; } public int DivisionID { get; set; } public string Name { get; set; } public string Description { get; set; } private static List _divisions; public static List Divisions { get { if (_divisions == null) { LoadAndSetUpDivisionsHierarchy(); } return _divisions; } } private static Dictionary _divisionsByID; public static Dictionary DivisionsByID { get { if (_divisionsByID == null) { LoadAndSetUpDivisionsHierarchy(); } return _divisionsByID; } } private static Division _root; public static Division Root { get { if (_root == null) { LoadAndSetUpDivisionsHierarchy(); } return _root; } } private Division _parentDivision; public Division ParentDivision { get { if (_parentDivision == null && DivisionID != 0) { _parentDivision = DivisionsByID[DivisionID]; } return _parentDivision; } } private List _subDivisions = new List(); public List SubDivisions { get { return _subDivisions; } } private static void LoadAndSetUpDivisionsHierarchyHierarchy() { // Load the divisions in a non-recursive way using LINQ // (details not shown here). _divisions = LoadDivisions(); // Add the divisions in a dictionary by id _divisionsByID = new Dictionary(_divisions.Count); foreach (Division division in _divisions) { _divisionsByID.Add(division.ID, division); } // Define sub-divisions and root division foreach (Division division in _divisions) { if (division.DivisionID == 0) { _root = division; } else if (division.ParentDivision != null) { division.ParentDivision.SubDivisions.Add(division); } } } private static List LoadDivisions() { throw new NotImplementedException(); } }