Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用父子关系初始化列表_C#_Linq_List_Collections_Datareader - Fatal编程技术网

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

C# 如何使用父子关系初始化列表,c#,linq,list,collections,datareader,C#,Linq,List,Collections,Datareader,假设我有以下课程: public class Parent { public string name; IList<Child> children; } public class Child { public string parentName; public int age; } 公共类父类 { 公共字符串名称; 孤独症儿童; } 公营儿童 { 公共字符串父名称; 公共信息; } 可以理解的是,每个父母都可以有多个孩子,我们也可以有多个父母。初始化这些类的

假设我有以下课程:

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 parents=GetParents()//假设它从db获取父对象
IList children=GetChildren()//假设它从db中获取子项
foreach(父对象中的父对象)
{
parent.children=children.Where(x=>x.parentName==parent.name).ToList();
}
或者获取所有父项并遍历每个父项,以按父项名称查询数据库以获取子项信息?由于我的要求,我不能使用datatable或dataset;我只能使用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
}
IList parents=GetParents()//假设它从db获取父对象
foreach(父对象中的父对象)
{
parent.children=GetChildrenByParentName();//假设它通过parentName从db获取父项
}

谢谢

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

编辑

此外,特别是如果数据集很大,您可以通过使用来实现更高的性能。这本质上为您创建了一个排序字典,这使得搜索适当的子项更加高效,因为框架可以使用二进制搜索。您可以按如下方式使用它:

var children = GetChildren().ToLookup(p => p.parentName);
。。。然后在你的循环中

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

我认为,如果父项和子项都有基本字段,您应该在数据库中为它们设置一个表,并有一个附加属性
Parent
,该属性引用同一个表行(因此它指向数据库中的父项),您可以确定该行是子行还是父行,是否具有
Parent
非空,那么它应该是具有父项的行的子元素

“Children”db表是否有指向“Parents”表的链接,例如有“parentId”列?如果是这样,那么如果您使用Linq to SQL或实体框架访问数据库,他们将为您处理关系。由于需要,我无法使用Linq to SQL或实体框架,我只能通过datareader获取数据。“Children”db表只有父名称,没有其他相关信息。父名称是这两者之间的唯一链接。