实体框架核心2.2嵌套选择生成多个查询

问题描述

我有一个与此类似的查询

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使用所有必需的联接执行一次查询,以便一次击中返回所有必需的数据,例如在非核心版本的Entity Framework中?

解决方法

是否有任何方法可以强制EF Core 2.2使用所有必需的联接执行一次查询,以便一次击中返回所有必需的数据,例如在非核心版本的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“多查询”模式。

回顾一下,K + 1查询模式是您可以在EFC 2.x中获得的最佳模式,如果您有许多子集合,则最好不要升级到EFC 3.x,而要等待EFC 5 .x并保持该模式。