Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架自引用表。如何获取父级直到到达根级_C#_Sql Server_Entity Framework - Fatal编程技术网

C# 实体框架自引用表。如何获取父级直到到达根级

C# 实体框架自引用表。如何获取父级直到到达根级,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我有一个自引用表,需要将表中的日期绑定到树视图用户控件。我使用BuildThree()方法获取子对象。我的问题是,在使用视图模型到达根父级之前,如何获取父级 我的实体: public partial class Category { public Category() { this.children = new HashSet<Category>(); }

我有一个自引用表,需要将表中的日期绑定到树视图用户控件。我使用BuildThree()方法获取子对象。我的问题是,在使用视图模型到达根父级之前,如何获取父级

我的实体:

 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中将根保存为静态属性,这样就不必通过向上移动父对象来查找根。