如何初始化具有父子关系的列表
本文关键字:父子关系 列表 初始化 | 更新日期: 2023-09-27 18:36:44
假设我有以下类:
public class Parent
{
public string name;
IList<Child> children;
}
public class Child
{
public string parentName;
public int age;
}
可以理解的是,每个父母都可以有多个孩子,我们可以有多个父母。初始化这些类的最佳方法是什么?获取所有父项以及数据库中的所有子项然后使用 LINQ 是否更好?
IList<Parent> parents = GetParents() //assume this gets parents from db
IList<Child> children = GetChildren() //assume this gets children from db
foreach(Parent parent in parents)
{
parent.children = children.Where(x=>x.parentName == parent.name).ToList();
}
还是获取所有父项并遍历每个父项以按父项名称查询数据库以获取子项信息?由于我有要求,我不能使用数据表或数据集;我只能使用数据读取器。
IList<Parent> parents = GetParents()//assume this gets parents from db
foreach(Parent parent in parents)
{
parent.children = GetChildrenByParentName();//assume this gets parents from db by parentName
}
谢谢
如果您无法利用 LinqToSql、实体框架或其他一些自定义查询方法,并且必须按照您建议的庄园将所有父项及其子项加载到数据库中,那么您的第一个选择很可能更胜一筹。假设您将查询两个表的所有行,第一个选项将只产生两个数据库查询。在第二个选项中,您将拥有与子项一样多的查询以及父项的查询。
编辑
此外,特别是如果数据集很大,您可以使用 Enumerable.ToLookup 实现进一步的性能。这实质上是为您创建一个排序字典,这使得搜索适当的子项更加有效,因为框架可以使用二叉搜索。您可以按如下方式使用它:
var children = GetChildren().ToLookup(p => p.parentName);
。然后在你的循环中...
parent.children = children[parent.name].ToList();
我认为如果父母和子项具有基本字段,则应该在数据库中为它们提供一个表,并具有一个附加属性Parent
,它引用同一表 - row ,(因此它指向数据库中的父级)您可以确定,如果该行是子行还是父行,如果它Parent
不为空, 那么它应该是带有 Parent
的 row 的子元素