通过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(); } }