2017-03-09 89 views
1

我有一個表表示類別之間可能的父子關係。根類別不會包含ParentId值,而非空。我認爲指出它應該構建N級深度也很重要。小巧構建包含相同對象類型的對象樹

例如考慮下面的Sql表。

分類: ID |名稱| ParentId

其中ParentId是返回到同一表的Id列的關係。

試圖瞭解是否可以填充以下類?

public class Category 
{ 
    public string Id 
    { 
     get; 
     set; 
    } 

    public string Name 
    { 
     get; 
     set; 
    } 

    public List<Category> Categories 
    { 
     get; 
     set; 
    } 
} 

從如方法:

public List<Category> GetCategories() 
{ 
     // construct using dapper. 
} 

回答

1

您可以從數據庫得到一個平坦的列表,並在C#組裝:

[TestFixture] 
public class Recursion 
{ 
    [Test] 
    public void Test() 
    { 
     using (var conn = new SqlConnection(@"Data Source=.\sqlexpress;Integrated Security=true; Initial Catalog=foo")) 
     { 
      var flatResult = conn.Query<Category>(@"select '1' as Id, 'Cat 1' as Name, ParentId = null 
                union all select '2' as Id, 'Cat 2' as Name, '1' as ParentId 
                union all select '3' as Id, 'Cat 3' as Name, '2' as ParentId 
                union all select '4' as Id, 'Cat 4' as Name, null as ParentId 
                union all select '5' as Id, 'Cat 5' as Name, 4 as ParentId"); 
      var tree = BuildTree(flatResult.ToList()); 
     } 
    } 

    private static IEnumerable<Category> BuildTree(List<Category> items) 
    { 
     items.ForEach(i => i.Categories = items.Where(ch => ch.ParentId == i.Id).ToList()); 
     return items.Where(i => i.ParentId == null).ToList(); 
    } 
}