假设我有以下课程:
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查询数据库以获取子节点信息?由于我的要求,我不能使用数据表或数据集;我只能使用datareader。
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
}
谢谢
答案 0 :(得分:2)
如果您无法利用LinqToSql,Entity Framework或其他一些自定义查询方法,并且您必须按照您建议的庄园加载数据库中的所有父母及其子女,那么您的第一个选项很可能更优越。假设您将查询两个表的所有行,第一个选项将只导致两个数据库查询。在第二个选项中,您将拥有与子项一样多的查询以及父项的查询。
修改强>
此外,特别是如果数据集很大,您可以使用Enumerable.ToLookup来获得进一步的性能。这基本上为您创建了一个排序字典,这使得搜索适当的子节点更加高效,因为框架可以使用二进制搜索。您可以按如下方式使用它:
var children = GetChildren().ToLookup(p => p.parentName);
...然后在你的循环中......
parent.children = children[parent.name].ToList();
答案 1 :(得分:0)
我认为如果父母和孩子有基本字段,你应该在数据库中有一个表,并有一个额外的属性Parent
,它引用同一个表 - 行,(所以它指向它数据库中的父级)您可以确定,如果该行是子级或父级,如果它具有Parent
非空,则它应该是具有Parent
的行的子元素