我被困具有建立一個遞歸通過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;
}
任何線索我可以從哪裏開始?
謝謝!
P.S.有沒有其他方法可以做到這一點?基於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; }
你是否試圖尋找答案,至少在堆棧溢出? http://stackoverflow.com/questions/4072166/linq-to-sql-recursive-query 看起來像一個直接重複。 – Ruslan 2012-03-29 16:00:13
@Ruslan它沒有我需要的答案。我需要把整個樹變成一些變種。 – 2012-03-29 16:05:54
@Peretz如果你需要整個事情,那麼你最好是按照原樣拉下列表並將其映射到內存樹中。 – Servy 2012-03-29 16:39:26