以下を参照してください。これらは、データベースにアクセスするために使用する POCO クラスです。コード ファースト アプローチを使用し、ApplicationEntityConfiguration を使用して、エンティティと DB テーブル間のすべてのマッピングを明示的に構成します。
public class Group
{
public string Code { get; set; }
public string Name { get; set; }
public virtual ICollection<Item> Items { get; set; }
}
public class Item
{
public string Code { get; set; }
public string Name { get; set; }
public virtual Group ParentGroup { get; set; }
}
グループとチャイルドの間の関係は明示的ではありません。外部キーはありません。論理的な関係はコードによって定義されます。グループには、親グループと同じコードで始まるコードを持つすべてのアイテムが含まれている必要があります
Context.Items.Where(x => x.Code.StartsWith(parentGroup.Code));
各グループのすべての子を持つデータベース内のすべてのグループのコレクションを呼び出し元メソッドに返す必要があります。データをリクエストするときは、Context.Groups をリクエストし、グループごとに Where を使用して Items をリクエストできます。データベースに 50 を超えるグループと 1000 を超えるアイテムがあるため、このような手動のアプローチでは、データベースに対して 50 を超えるクエリが発生し、パフォーマンスに影響を与えます。
より最適な解決策は、1 つのコレクション内のすべてのグループを要求し、次に別のコレクション内のすべてのアイテムを要求し、それらすべてのデータがメモリ内にあるときに、各グループのアイテムのコレクションを埋めることです...その後、DB にあまりヒットしません。
したがって、一般的に目標を達成することはできますが、グループとアイテム間の関係が .Where(x => x.Code.StartsWith (parentGroup.Code)) が宣言されると、開発者は、グループとアイテムを一緒にロードしたい場合に Include() を使用したり、アクセス時に子アイテムをロードできる遅延ロードに依存したりできます。