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 并保持该模式。
我有一个类似的查询:
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 并保持该模式。