如何使用父子关系初始化列表

Posted

技术标签:

【中文标题】如何使用父子关系初始化列表【英文标题】:How to initialize list with parent child relation 【发布时间】:2013-10-24 21:50:36 【问题描述】:

假设我有以下课程:

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();

或者获取所有的父母并遍历每个父母以通过parentName查询数据库以获取孩子的信息?由于我的要求,我不能使用数据表或数据集;我只能使用数据阅读器。

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

谢谢

【问题讨论】:

“Children”数据库表是否有指向“Parents”表的链接,例如有“parentId”列?如果是这样,那么如果您使用 Linq to SQL 或实体框架访问数据库,他们将为您处理关系。 由于要求,我不能使用Linq to SQL或Entity Framework,只能通过datareader获取数据。 “子”数据库表只有父名,没有其他相关信息。父名是这两者之间的唯一联系。 【参考方案1】:

如果您无法利用 LinqToSql、Entity Framework 或其他一些自定义查询方法,并且您必须按照您建议的庄园将所有父母及其子女加载到数据库中,那么您的第一个选项很可能更优越。假设您将查询两个表的所有行,第一个选项将只导致两个数据库查询。在第二个选项中,您将拥有与孩子数量一样多的查询以及针对父母的查询。

编辑

此外,尤其是在数据集很大的情况下,您可以通过使用Enumerable.ToLookup 获得进一步的性能。这实质上为您创建了一个排序字典,这使得搜索适当的孩子更加有效,因为框架可以使用二进制搜索。您可以按如下方式使用它:

var children = GetChildren().ToLookup(p => p.parentName);

...然后在您的循环中...

parent.children = children[parent.name].ToList();

【讨论】:

【参考方案2】:

我认为如果父母和孩子都有基本字段,你应该在数据库中有一个表,并有一个附加属性Parent,它引用同一个表-行,(所以它指向它的父数据库)你可以确定,如果该行是子元素或父元素,如果它有Parent不为空,那么它应该是带有Parent的行的子元素

【讨论】:

以上是关于如何使用父子关系初始化列表的主要内容,如果未能解决你的问题,请参考以下文章

初始化列表中的依赖关系

通过递归检查父子关系C#构建树类型列表

如何知道父子 C# 列表中的深度计数 [关闭]

通过数组元素的父子关系形成一个字典类型的树列表

关于父子关系和组件的问题

使用 jquery 用新数据覆盖现有的 select2 多选下拉列表