在此处使用C#。我有一个包含3个属性的旧类Person:
- 编号(引导)
- 名称
- 父母身分证(guid)
在SQL中,它存储在两个表中:
- 表人:包含ID和名称
- 表关系:包含PersonId,ParentId
例如,给出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>
中?
答案 0 :(得分:1)
我为此问题编写了一个Test,在此之前关注数据来自何处?数据库?还是它们在内存中?
我同时写下了这两个状态。
来自数据库的数据代码:
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()
});
内存中数据的代码:
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; }
}
这些代码用于多级数据。
祝你好运。