1

次のクラスがあるとします。

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
}

ありがとうございました

4

2 に答える 2

2

LinqToSql、Entity Framework、またはその他のカスタム クエリ メソッドを活用できず、提案したマナーに従ってすべての親とその子をデータベースにロードする必要がある場合は、最初のオプションが優れている可能性が高くなります。両方のテーブルのすべての行に対してクエリを実行すると仮定すると、最初のオプションでは 2 つのデータベース クエリしか発生しません。2 番目のオプションでは、子と親のクエリを合わせた数のクエリを作成します。

編集

さらに、特にデータ セットが大きい場合は、Enumerable.ToLookupを使用してさらにパフォーマンスを向上させることができます。これにより、基本的にソートされた辞書が作成され、フレームワークがバイナリ検索を利用できるため、適切な子の検索がはるかに効率的になります。次のように使用できます。

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

...そしてあなたのループで...

parent.children = children[parent.name].ToList();
于 2013-10-24T22:10:09.677 に答える
0

親と子に基本的なフィールドがある場合、データベースにそれらのテーブルが1つあり、同じテーブルを参照する追加のプロパティを持つ必要があると思いParentます-行(データベース内の親を指すように)を決定できます、行が子または親の場合、Parentnull でない場合は、行の子要素である必要があります。Parent

于 2013-11-11T15:20:46.347 に答える