从数据库创建树

时间:2018-07-18 12:23:40

标签: c# entity-framework linq tree

我的DataTable由行组成,这些行具有称为recordId,recordName,parentId的字段。我想要做的是显示记录的父子关系,但是我无法就如何构建这样的树创建具体的逻辑。我试图将记录放入如下模型中:

public class Records
{
    public int recordId{ get; set; }
    public string recordName{ get; set; }
    public List<Records> ChildRecords{ get; set; }

}

然后,我从具有parentId == 0(这些都是根的所有子代)的记录开始。然后,我递归地尝试获取这些记录的子记录,但是,我在某些时候停留了好几次。

有没有人可以向我展示一种创建家谱的方法。

编辑:

可以说DB条目:(1 A 0,2 B 0,3 C 1,4 D 1,5 E 3,6 F 2,7 G 6,8 H 7)

A->(C-> E,D)

B->(F-> G-> H)

我很累的基本上是让孩子扎根。然后根据获取的ID,我找到了父母的最后一个孩子。

Ex:对于A,首先得到A,然后经过C,然后得到其子E。之后,我试图跟踪放置D的位置并弄糟。

2 个答案:

答案 0 :(得分:1)

namespace TestConsoleApp
{
    public class Record
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public int? ParentId { get; set; }
        public List<Record> ChildRecords { get; set; }

    }

    class Program
    {
        static void Main(string[] args)
        {
            var RecordsStore = new List<Record>();

            //Get the standalone recoreds
            var standaloneRecords = RecordsStore.Where(x => x.ParentId == null).Select(x => new Record
            {
                Id = x.Id,
                Name = x.Name,
                ChildRecords = new List<Record>()
            });

            //Traverse
            List<Record> records = new List<Record>();
            foreach (var item in standaloneRecords)
                records.Add(Traverse(item, RecordsStore));

        }


        private static Record Traverse(Record parent, List<Record> records)
        {
            parent.ChildRecords = records.Where(x => x.ParentId == parent.Id)
                                              .Select(x => new Record
                                              {
                                                  Id = x.Id,
                                                  Name = x.Name,
                                                  ChildRecords = new List<Record>()
                                              }).ToList();
            foreach (var item in parent.ChildRecords)
                Traverse(item, records);
            return parent;
        }
    }  
}

您可以这样做

答案 1 :(得分:0)

您可以这样声明模型类

    public class Record
    {
        [Key]
        public int recordId{ get; set; }
        public string recordName{ get; set; }

        [ForeignKey("ParentRecordDetails")]
        public int ParentId {get;set;}
        public Record ParentRecordDetails {get;set;}

    }

然后在LINQ中编写自连接以递归获取树结构

参考:https://bitlush.com/blog/recursive-hierarchical-joins-in-c-sharp-and-linq