映射对象的父子列表的最佳方法

时间:2018-08-03 21:57:52

标签: c# linq

在此处使用C#。我有一个包含3个属性的旧类Person:

  
      
  1. 编号(引导)
  2.   
  3. 名称
  4.   
  5. 父母身分证(guid)
  6.   

在SQL中,它存储在两个表中:

  
      
  1. 表人:包含ID和名称
  2.   
  3. 表关系:包含PersonId,ParentId
  4.   

例如,给出Person的对象(为简单起见,不显示guid):

  
      
  • parent1:Id = 1,名称= Bob,ParentId =空
  •   
  • child1:Id = 2,名称= Scott,ParentId = 1
  •   
  • child11:Id = 3,姓名= Scott jr,ParentId = 2
  •   
  • child12:Id = 4,姓名= John,ParentId = 2
  •   
  • parent2:Id = 5,姓名= James,ParentId =空
  •   
  • child21:Id = 6,姓名= jr jr,ParentId = 5
  •   

我想建立List<NewPerson> 其中NewPerson是一个包含以下内容的类:

  
      
  • 编号
  •   
  • 名称
  •   
  • 孩子为List<NewPerson>
  •   

以树形形式显示它们:

  
      
  • 鲍勃
  •   
  • ---斯科特
  •   
  • --------小斯科特
  •   
  • --------约翰
  •   
  • 詹姆斯
  •   
  • ---小詹姆斯
  •   

是否有一种有效的方法将旧公寓List<Person>映射到层次结构(世代)List<NewPerson>中?

1 个答案:

答案 0 :(得分:1)

我为此问题编写了一个Test,在此之前关注数据来自何处?数据库?还是它们在内存中?

我同时写下了这两个状态。

  1. 来自数据库的数据代码:

        listPerson.GroupBy(x => x.ParentId).Select(x => new TreePerson()
        {
            Id = x.First(c=>c.ParentdId == x.Key).Id,
            Name = x.First(c => c.ParentId == x.Key).Name,
            Children = x.Where(c => c.ParentdId == x.Key).GroupBy(c => c.Id).Select(c 
                => new Person()
            {
                Id = c.Key,
                Name = c.First(z => z.Id == c.Key).Name,
                SubLevelPerson = c.FirstOrDefault(v=>v.ParentdId == c.Key)
            }).ToList()
        });
    
  2. 内存中数据的代码:

        listPerson.Where(x => x.ParentdId == null).Select(x => new TreePerson()
        {
            Id = x.Id,
            Name = x.Name,
            Children = listPerson.Where(c => c.ParentdId == x.Id).GroupBy(c => c.Id).Select(c => new Person()
            {
                Id = c.Key,
                Name = c.First(z => z.Id == c.Key).Name,
                SubLevelPerson = c.FirstOrDefault(v => v.ParentdId == c.Key)
            }).ToList()
        });
    

请注意您的班级应该喜欢这些班级:

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? ParentdId { get; set; }
    public Person SubLevelPerson { get; set; }
}

public class TreePerson
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Person> Children { get; set; }
}

这些代码用于多级数据。

祝你好运。