Entity Framework Core 2.2 嵌套 select 生成多个查询

Entity Framework Core 2.2 nested select generates multiple queries

我有一个类似的查询:

var customers = dbContext.Customers.Select(c => new 
                {
                    FirstName = c.FirstName,
                    LoanStatuses = c.LoanRequests.Select(l => l.Status)
                }).ToList();

当执行 ToList() 时,属性 LoanStatuses 没有具体化,就像在 EntityFramework 中发生的那样,而是在调用 customer.LoanStatuses 时发送新的查询。

我还尝试按照各种博客的建议在 .Select 方法中添加 ToList() 。这很好用,但是,发送了 2 个查询而不是一个(实际上,因为我有 8 个与此类似的集合属性,所以我得到 9 个查询而不是一个。

有没有什么方法可以强制 EF Core 2.2 执行单个查询,并使用所有必需的连接,以便 return 一次性命中所有必需的数据,就像 [= 的非核心版本一样22=]?

Is there any way to force EF Core 2.2 to perform a single query, with all the required joins in order to return all the required data in a single hit, like in non core versions of Entity Framework?

没有。单一查询模式已经introduced in EF Core 3.0.

在 EF Core 2.x 中,您应该在集合预测中使用前面提到的 ToList 来获得 K + 1 查询,其中 K 是相关集合的数量。这样至少可以避免 N * K + 1 查询(最差),其中 N 是主查询返回的记录数。

但请注意,对于许多子集合,这实际上比单个查询更好,而 EF Core 3.x 受此影响,尤其是包含多个集合时。

这就是为什么 EF Core 5.0 将引入 split query option 以允许恢复 EFC 2.x“multi-query”模式。

总而言之,K + 1 查询模式是 EFC 中最好的 2.x,如果你有很多子集合,最好不要升级到 EFC 3.x , 但等待 EFC 5.x 并保持该模式。