EF 核心:提取实体及其子项的列表



我有PostPostImage实体。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,但没有任何变化。

附言我正在使用EntityFramework Core。

一次(单个 SQL 查询( - 否。因为这就是 EF Core 查询的工作方式。最小值为主数据一个 SQL 查询 + 每个集合 1 个 SQL 查询。对于您的情况,最少为 2 个 SQL 查询。仍然比您目前遇到的N + 1查询问题要好得多。

解决方案是使用 EF Core 2.1+,它具有相关子查询的优化。此外,如文档链接中所述,您必须通过"在正确的位置包含ToList()">来选择加入该优化:

var posts = _appDataContext.Posts
.Select(x => new
{
x.Id,
x.Title,
x.Body,
Images = x.Images.Select(y => new
{
y.Id
}).ToList() // <--
});

最新更新