这是一个带有引用自身的category实体的示例。首先,我们应该准备数据源:
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
public int? ParentId { get; set; }
public virtual Category Parent { get; set; }
public virtual ICollection<Category> Children { get; set; }
public byte[] Image { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Code { get; set; }
public string Name { get; set; }
public Category ProductCategory { get; set; }
public int ProductCategoryId { get; set; }
public byte[] Image { get; set; }
}
public List<Category> GethierarchicalTree(int? parentId=null)
{
var allCats = new BaseRepository<Category>().GetAll();
return allCats.Where(c => c.ParentId == parentId)
.Select(c => new Category()
{
Id = c.Id,
Name = c.Name,
ParentId = c.ParentId,
Children = GetChildren(allCats.ToList(), c.Id)
})
.ToList();
}
public List<Category> GetChildren(List<Category> cats, int parentId)
{
return cats.Where(c => c.ParentId == parentId)
.Select(c => new Category
{
Id = c.Id,
Name = c.Name,
ParentId = c.ParentId,
Children = GetChildren(cats, c.Id)
})
.ToList();
}
那么在我们的代码背后我们有:
protected void Page_Load(object sender, EventArgs e)
{
var hierarchicalData = new CategoryRepository().GethierarchicalTree();
tv1.Nodes.Clear();
var root = new TreeNode("0","Root");
tv1.Nodes.Add(root);
BindTreeRecursive(hierarchicalData, root);
}
private void BindTreeRecursive(List<Category> hierarchicalData, TreeNode node)
{
foreach (Category category in hierarchicalData)
{
if (category.Children.Any())
{
var n = new TreeNode(category.Name, category.Id.ToString());
node.ChildNodes.Add(n);
BindTreeRecursive(category.Children.ToList(), n);
}
else
{
var n = new TreeNode(category.Name, category.Id.ToString());
node.ChildNodes.Add(n);
if (new ProductRepository().Get(a => a.ProductCategoryId == category.Id).Any())
{
var catRelatedProducts = new ProductRepository().Get(a => a.ProductCategoryId == category.Id).ToList();
foreach (Product product in catRelatedProducts)
{
n.ChildNodes.Add(new TreeNode(product.Name,product.Id.ToString()));
}
}
}
}
}