我有一个表,它表示类别之间可能的父子关系。根类别不会包含 ParentId 值,而是 null。我认为还需要指出的是,它应该构建 N 级深度。
例如,考虑以下 Sql 表。
类别: 身份证 |名称 |父级 ID
其中 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.
}
最佳答案
您可以从数据库获取平面列表并用 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();
}
}
关于Dapper 构建包含相同对象类型的对象树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42689413/