默认情况下使用延迟加载,我知道您应该在Entity Framework实体上调用.Include()来拉入您要在查询中关联的实体,以减少在数据库上调用LINQ方法时对数据库的调用次数实体。如果不这样做,则冒着对每一行重复数据库调用的风险(N + 1问题)
有人可以确认如果我编写了一个显式定义的联接的规范LINQ查询,那么我们可以防止N + 1吗?
from x in _context.tblOrder
join y in _context.tblCustomer equals y.id = x.customerId
select x
当我们使用联接加载所有必需的实体时,N + 1会以任何方式蔓延吗?
编辑
作为背景,有人问初级开发人员如何防范N + 1。我提到了最简单的方法是写出您的查询并定义您的联接,我想要确认那是100%准确的。
如果您真正要问的是
该查询将一次命中数据库吗?
那么答案是肯定的。LINQ to EF会将您的表达式转换为原始SQL,只有在您评估查询时,它才会将任何内容发送到数据库,例如ToList()
/ foreach
/ for
etc。一旦发送了该查询,就不会发送其他任何内容,除非您另外明确声明。
您的LINQ语句可以使用Lambda表达式进行简化,例如
_context.tblOrder.Include("Customer").ToList();
这将在一次数据库行程中为您提供所有订单详细信息,包括所有相关的客户详细信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句