【发布时间】:2012-03-29 15:57:28
【问题描述】:
我不得不通过 LINQ 为自引用表构建递归选择。
我使用这个类:
public class DivisionHierarchy
{
public Division Division { get; set; }
public IEnumerable<DivisionHierarchy> Divisions { get; set; }
}
我创建了这个函数,但不知何故它是无限的。
public IEnumerable<DivisionHierarchy> GetDivisionHierarchy(IEnumerable<Division> allDivisions, Division parentDivision)
{
Guid? parentDivisionId = null;
if (parentDivision != null)
parentDivisionId = parentDivision.DivisionID;
var childDivisions = allDivisions.Where(e => e.DivisionID == parentDivisionId);
Collection<DivisionHierarchy> hierarchy = new Collection<DivisionHierarchy>();
foreach (var div in childDivisions)
hierarchy.Add(new DivisionHierarchy() { Division = div, Divisions = GetDivisionHierarchy(allDivisions, div) });
return hierarchy;
}
任何线索我可以从哪里开始?
谢谢!
附:还有其他方法吗?
更新基于http://www.scip.be/index.php?Page=ArticlesNET18#AsHierarchy
我发现了我的错误。
有两件事要实现: 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<DivisionHierarchy> GetDivisionHierarchy(IEnumerable<Division> allDivisions, Division parentDivision) { Guid? parentDivisionId = null; if (parentDivision != null) parentDivisionId = parentDivision.ID; var childDivisions = allDivisions.Where(division => division.DivisionID == parentDivisionId); Collection<DivisionHierarchy> hierarchy = new Collection<DivisionHierarchy>(); foreach (var div in childDivisions) { DivisionHierarchy divisionHierarchy = new DivisionHierarchy(); divisionHierarchy.Division = div; divisionHierarchy.Divisions = GetDivisionHierarchy(allDivisions, div); hierarchy.Add(divisionHierarchy); } return hierarchy; }
【问题讨论】:
-
您是否尝试过至少在堆栈溢出时搜索答案? stackoverflow.com/questions/4072166/linq-to-sql-recursive-query 看起来像直接复制品。
-
@Ruslan 它没有我需要的答案。我需要将整棵树放入某个变量中。
-
@Peretz 如果您需要全部内容,那么您最好直接拉下列表并将其映射到内存中的一棵树。
标签: c# .net linq recursive-query