我有以下模型:
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; }
}
基本上一个人可以属于多个类别。该代码导致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 个请求。
如果我使用Include如下:
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 个请求 - 一个获取所有类别,另一个获取所有人。然后,理想情况下,这两个数组应该在内存中加入 - 所以当我枚举Person.Categories时,它不会进入数据库,而是会获取预加载的数据。这可以通过EF实现吗?