2015-07-12 52 views
1

我正在使用SQL Server和實體框架。在我的數據庫,我有以下數據:如何將帶有ParentID的項目列表轉換爲樹形?

ID | Name | ParentID 
1 | Fire | null 
2 | Fire2 | 1 
3 | Fire3 | 2 
4 | Blast | 2 
5 | Water | null 
6 | Water2 | 5 
7 | WaterX | 5 

我不會有大量的數據,所以在一次從數據庫是完全可以接受的檢索一切。

我想檢索這些數據並在屏幕上顯示爲「樹」。

Fire 
    Fire2 
Fire3 Blast 

    Water 
Water2 WaterX 

我該怎麼做?我應該創建某種遞歸來呈現它嗎?我應該不知何故將列表轉換爲IGrouping?

我無法將平板列表轉換爲可以在屏幕上分層顯示的東西,我該怎麼做?

+0

遞歸是答案 –

+0

這就像5個不同的問題...你想知道如何將其轉換爲結構樹對象?或者你想知道如何從後端獲取這個列表並在前端渲染爲一棵樹?爲此,我會說找到一個你喜歡的圖書館並格式化該圖書館的數據。 – thinklarge

+0

對不起,我只是在尋找一種方法來實現以樹形格式顯示數據的最終結果。我不知道哪個是最好的方法,所以我在同一時間想着5個不同的東西,這讓我很頭疼哈哈:) – BrunoLM

回答

1

如果你可以添加另一個屬性類具有子項是這樣的:

public class Thing 
{ 
    public Thing() 
    { 
     Things = new List<Thing>(); 
    } 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int? ParentId { get; set; } 
    public List<Thing> Things { get; set; } 
} 

然後你就可以輕鬆地集團的項目,以他們的父母是這樣的:

var things = new List<Thing> 
{ 
    new Thing { Id = 1, Name = "Fire", ParentId = null }, 
    new Thing { Id = 2, Name = "Fire2", ParentId = 1 }, 
    new Thing { Id = 3, Name = "Fire3", ParentId = 2 }, 
    new Thing { Id = 4, Name = "Blast", ParentId = 2}, 
    new Thing { Id = 5, Name = "Water", ParentId = null }, 
    new Thing { Id = 6, Name = "Water2", ParentId = 5 }, 
    new Thing { Id = 7, Name = "Waterx", ParentId = 6 } 
}; 

var groupedThings = new List<Thing>(); 

foreach (var thing in things) 
{ 
    if (thing.ParentId != null) 
    { 
     things.First(t => t.Id == thing.ParentId).Things.Add(thing); 
    } 
    else 
    { 
     groupedThings.Add(thing); 
    } 
} 

groupedThings.Dump(); 

1

這是我知道的最簡單的方法:

var things = new [] 
{ 
    new { Id = 1, Name = "Fire", ParentId = (int?)null }, 
    new { Id = 2, Name = "Fire2", ParentId = (int?)1 }, 
    new { Id = 3, Name = "Fire3", ParentId = (int?)2 }, 
    new { Id = 4, Name = "Blast", ParentId = (int?)2 }, 
    new { Id = 5, Name = "Water", ParentId = (int?)null }, 
    new { Id = 6, Name = "Water2", ParentId = (int?)5 }, 
    new { Id = 7, Name = "Waterx", ParentId = (int?)5 } 
}; 

var tree = things.ToLookup(x => x.ParentId, x => new { x.Id, x.Name }); 

的樹是這個樣子:

tree

這應該是相當容易的,現在來呈現。