私は次のモデルを持っています:
public class Person
{
public int Id { get; set; }
public virtual ICollection<Category> Categories { get; set; }
}
public class Category
{
public int Id { get; set; }
public string Name { get; set; }
}
基本的に1人が複数のカテゴリーに所属できます。そのコードにより、CategoryPerson { PersonId, CategoryID }
EF によって作成されたテーブルが作成されました。ここで、すべての人物をすべてのカテゴリとともにリストに表示したいと考えています。単純なアプローチ:
var people = context.People.ToList();
foreach (var p in people)
{
Console.WriteLine("Person {0}, categories: {1}", p.Id, string.Join("|", p.Categories.Select(x => x.Name)));
}
データベースへの 1 + N リクエストになります。
次のようにインクルードを使用する場合:
var people = context.People.Include(x => x.Categories).ToList();
foreach (var p in people)
{
Console.WriteLine("Person {0}, categories: {1}", p.Id, string.Join("|", p.Categories.Select(x => x.Name)));
}
リクエストは 1 つしか取得できませんが、これは 2 つのテーブルの結合であり、Person レコードが重く、関連するカテゴリが複数ある場合、同じ重いデータが複数回返されます。
{ person1, category1 }
{ person1, category2 }
{ person1, category3 }
等
理想的には、データベースへの 2 つの要求を行う必要があります。1 つはすべてのカテゴリを取得するためのもので、もう 1 つはすべての人を取得するためのものです。そして、理想的には、これらの 2 つの配列をメモリ内で結合する必要があります。そのため、Person.Categoriesを列挙すると、データベースには移動せず、代わりにプリロードされたデータが取得されます。これはEFで達成できますか?