entity-framework - Entity Framework - 使用包含/急切加载和延迟加载有什么区别?

标签 entity-framework lazy-loading eager-loading

我一直在尝试熟悉 Entity Framework 。其中大部分看起来很简单,但我对使用 Include 方法的急切加载和默认的延迟加载之间的区别有点困惑。两者似乎都加载了相关的实体,所以从表面上看,它们似乎在做同样的事情。我错过了什么?

最佳答案

假设您有两个具有一对多关系的实体:客户和订单,其中每个客户可以有多个订单。

加载客户实体时, Entity Framework 允许您预先加载或延迟加载客户的订单集合。如果您选择预先加载 Orders 集合,当您从数据库中检索客户时, Entity Framework 将生成 SQL,该 SQL 会在一个查询中检索客户的信息和客户的订单。但是,如果您选择延迟加载 Orders 集合,当您从数据库中检索客户时, Entity Framework 将生成仅提取客户信息的 SQL(如果您稍后访问客户的 Orders 集合, Entity Framework 将生成单独的 SQL 语句在您的代码中)。

确定何时使用急切加载以及何时使用延迟加载都归结为您希望对检索到的实体执行什么操作。如果您知道您只需要客户的信息,那么您应该延迟加载 Orders 集合(这样 SQL 查询就可以通过仅检索客户的信息来高效)。相反,如果您知道需要遍历客户的订单,那么您应该预先加载订单(这样一旦您在代码中访问客户的订单,就可以节省额外的数据库命中)。

附言使用延迟加载时要非常小心,因为它会导致 N+1 问题。例如,假设您有一个显示客户列表及其订单的页面。但是,您决定在获取订单时使用延迟加载。当您遍历 Customers 集合,然后遍历每个 Customer 的 Orders 时,您将为每个 Customer 执行数据库命中以延迟加载到他们的 Orders 集合中。这意味着对于 N 个客户,您将有 N+1 次数据库命中(1 次数据库命中以加载所有客户,然后 N 次数据库命中以加载他们的每个订单),而不是使用即时加载时只有 1 次数据库命中(这将在一个查询中检索所有客户及其订单)。

关于entity-framework - Entity Framework - 使用包含/急切加载和延迟加载有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3505170/

相关文章:

ruby-on-rails - Rails 4 Eager Load has_many 单个对象的关联

c# - 是否可以使用所有记录或匹配 id 方法从数据库中检索记录?

c# - Entity Framework 初始化最佳实践

c# - FirstOrDefault 内联空检查

Angular 5 : Lazy-loading of component without routing

iphone - UIImageView 带有大图像。问题

c# - LINQ to Entities 日期时间比较

javascript - 使用数据参数延迟加载外部 Javascript

ruby-on-rails - Rails 预加载问题 Find( :all, :include => [:model])

ruby-on-rails-4 - Rails 4 急切加载对象