问题描述
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并保持该模式。