C# 实体框架自引用表。如何获取父级直到到达根级
我有一个自引用表,需要将表中的日期绑定到树视图用户控件。我使用BuildThree()方法获取子对象。我的问题是,在使用视图模型到达根父级之前,如何获取父级 我的实体:C# 实体框架自引用表。如何获取父级直到到达根级,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我有一个自引用表,需要将表中的日期绑定到树视图用户控件。我使用BuildThree()方法获取子对象。我的问题是,在使用视图模型到达根父级之前,如何获取父级 我的实体: public partial class Category { public Category() { this.children = new HashSet<Category>(); }
public partial class Category
{
public Category()
{
this.children = new HashSet<Category>();
}
public int CategoryId { get; set; }
public string CategoryName { get; set; }
public Nullable<int> ParentCategoryId { get; set; }
public virtual ICollection<Category> children { get; set; }
public virtual Category Parent { get; set; }
}
公共部分类类别
{
公共类别()
{
this.children=newhashset();
}
public int CategoryId{get;set;}
公共字符串CategoryName{get;set;}
公共可空ParentCategoryId{get;set;}
公共虚拟ICollection子项{get;set;}
公共虚拟类别父项{get;set;}
}
我的视图模型:
public class TreeViewModel
{
public TreeViewModel()
{
this.children = new HashSet<TreeViewModel>();
}
public int id { get; set; }
public string text { get; set; }
public virtual TreeViewModel MyParent { get; set; }
public virtual IEnumerable<TreeViewModel> children { get; set; }
}
公共类树视图模型
{
公共树视图模型()
{
this.children=newhashset();
}
公共int id{get;set;}
公共字符串文本{get;set;}
公共虚拟树视图模型MyParent{get;set;}
公共虚拟IEnumerable子项{get;set;}
}
这就是我用来生孩子的方法
public IEnumerable<TreeViewModel> BuildThree(IEnumerable<Category> categories, int? parentCategoryId = null)
{
if (categories == null)
return null;
var result = categories.Select(c => new TreeViewModel()
{
id = c.CategoryId,
text = c.CategoryName,
children = BuildThree(c.children, c.CategoryId)
});
return result;
}
Database1Entities db = new Database1Entities();
var category = db.Categories.Find(id);
TreeViewModel vm = new TreeViewModel();
vm.id = category.CategoryId;
vm.text = category.CategoryName;
vm.children = BuildThree(category.children);
公共IEnumerable构建三(IEnumerable类别,int?parentCategoryId=null)
{
如果(类别==null)
返回null;
var result=categories.Select(c=>newtreeviewmodel()
{
id=c.类别id,
text=c.CategoryName,
children=BuildThree(c.children,c.CategoryId)
});
返回结果;
}
Database1Entities db=新的Database1Entities();
var category=db.Categories.Find(id);
TreeViewModel vm=新的TreeViewModel();
vm.id=category.CategoryId;
vm.text=category.CategoryName;
vm.children=BuildThree(category.children);
如果您只是想找到一种方法来填充
MyParent
property,那么就必须对BuildThree
方法进行一些小的更改
public IEnumerable<TreeViewModel> BuildThree(IEnumerable<Category> categories, TreeViewModel parentCategory)
{
if (categories == null)
return null;
var result = new List<TreeViewModel>();
foreach (var category in categories)
{
var treeViewModel = new TreeViewModel();
treeViewModel.Id = category.CategoryId,
treeViewModel.Text = category.CategoryName,
treeViewModel.MyParent = parentCategory;
treeViewModel.Children= BuildThree(category.children,treeViewModel);
result.Add(treeViewModel);
}
return result;
}
public IEnumerable BuildThree(IEnumerable类别、TreeView模型父类别)
{
如果(类别==null)
返回null;
var result=新列表();
foreach(类别中的var类别)
{
var treeViewModel=新的treeViewModel();
treeViewModel.Id=category.CategoryId,
treeViewModel.Text=category.CategoryName,
treeViewModel.MyParent=parentCategory;
treeViewModel.Children=BuildThree(category.Children,treeViewModel);
结果.Add(treeViewModel);
}
返回结果;
}
将属性添加到包含父对象的类别类中:类别父对象。我不喜欢往树上爬。相反,我编写了不需要向上移动的递归算法。我返回子信息作为递归方法的返回值。@jdweng。谢谢你的帮助。如果你不忙,可以用我的代码告诉我如何实现你的想法吗?很抱歉,我对编程很陌生。非常感谢你为什么你需要父母?您应该在TreeViewModel中将根保存为静态属性,这样就不必通过向上移动父对象来查找根。