EF Core:获取实体及其子实体的列表
EF Core: Fetching A List of Entities with Their Children
我有 Post
和 PostImage
个实体。 Post
个实体可以有一个 PostImage
个实体的列表(即一对多)。我想获取所有帖子的列表并包含其所有图像列表。所以我写了下面这段代码:
var posts = _appDataContext.Posts
.Select(x => new
{
x.Id,
x.Title,
x.Body,
Images = x.Images.Select(y => new
{
y.Id
})
});
代码全部在数据库中执行,这正是我想要的,但这里有问题。从控制台日志来看,EF 似乎首先获取帖子列表,然后遍历它们以获取其相应的图像(额外查询 + 额外获取时间)。有没有其他方法可以一次获取所有数据(帖子+他们的图片)。帖子和图片都有额外的列,这就是我使用 Select
语句的原因;过滤掉我不需要的列。我尝试使用 Include
,但没有任何改变。
P.S。我正在使用 EntityFramework 核心。
立即(单个 SQL 查询)- 否。因为这就是 EF Core 查询的工作方式。最小值是一个 SQL 查询主要数据 + 1 个 SQL 查询每个集合。对于您的情况,最少需要 2 SQL 个查询。仍然比您当前遇到的 N + 1 个查询问题要好得多。
解决方案是使用具有 Optimization of correlated subqueries 的 EF Core 2.1+。同样如文档 link 中所述,您必须通过 "including ToList()
in the right place(s)":
选择加入该优化
var posts = _appDataContext.Posts
.Select(x => new
{
x.Id,
x.Title,
x.Body,
Images = x.Images.Select(y => new
{
y.Id
}).ToList() // <--
});
我有 Post
和 PostImage
个实体。 Post
个实体可以有一个 PostImage
个实体的列表(即一对多)。我想获取所有帖子的列表并包含其所有图像列表。所以我写了下面这段代码:
var posts = _appDataContext.Posts
.Select(x => new
{
x.Id,
x.Title,
x.Body,
Images = x.Images.Select(y => new
{
y.Id
})
});
代码全部在数据库中执行,这正是我想要的,但这里有问题。从控制台日志来看,EF 似乎首先获取帖子列表,然后遍历它们以获取其相应的图像(额外查询 + 额外获取时间)。有没有其他方法可以一次获取所有数据(帖子+他们的图片)。帖子和图片都有额外的列,这就是我使用 Select
语句的原因;过滤掉我不需要的列。我尝试使用 Include
,但没有任何改变。
P.S。我正在使用 EntityFramework 核心。
立即(单个 SQL 查询)- 否。因为这就是 EF Core 查询的工作方式。最小值是一个 SQL 查询主要数据 + 1 个 SQL 查询每个集合。对于您的情况,最少需要 2 SQL 个查询。仍然比您当前遇到的 N + 1 个查询问题要好得多。
解决方案是使用具有 Optimization of correlated subqueries 的 EF Core 2.1+。同样如文档 link 中所述,您必须通过 "including ToList()
in the right place(s)":
var posts = _appDataContext.Posts
.Select(x => new
{
x.Id,
x.Title,
x.Body,
Images = x.Images.Select(y => new
{
y.Id
}).ToList() // <--
});