c# - 预加载和显式加载之间的区别

标签 c# entity-framework ef-core-2.1

预加载:

context.Cars.Include(c=>c.Orders)

显式加载:

context.Entry(c).Collection(x => x.Orders).Load();

预加载和显式加载有什么区别?难道只是语法差异,比如急切加载使用 Include 而显式加载使用 Load 吗?但是,使用 Include 不是也是“显式加载”吗? “加载导航属性的方式,那么为什么预加载不被视为与显式加载相同?

最佳答案

预加载与延迟加载相反,但显式加载与延迟加载类似,不同之处在于:您在代码中显式检索相关数据;当您访问导航属性时,它不会自动发生。

您可以通过获取实体的对象状态管理器条目并调用集合的 Collection.Load 方法或调用包含单个实体的属性的 Reference.Load 方法来手动加载相关数据。

EntityFramework 返回 IQueryable 对象,它本质上包含对数据库的查询。但这些直到第一次枚举时才会执行。

Load() 执行查询,以便将其结果存储在本地。 调用 Load() 与调用 ToList() 并丢弃该 List 相同,而无需创建 List 的开销。

关于c# - 预加载和显式加载之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57396599/

相关文章:

c# - 按搜索字符串字母顺序 LINQ 开头的名称排序

c# - 从另一个列表中删除项目列表

C# 将类型转换为相同类型的 IEnumerable?

c# - 如何在 Entity Framework 6(数据库优先)中设置默认值

c# - EF Core、OData v4、Automapper - 使用嵌套 $expand 查询时出现空引用异常

c# - 关于何时需要特定 DTO 类的另一个讨论

entity-framework - Entity Framework 中多列的唯一键约束

c# - Entity Framework 错误关键字不支持 : provider\r\nconnection string

c# - 调用 .Entry() 时会触发 DbContext 的 ChangeTracker.StateChanged

c# - 如何使用 LINQ 和 EF Core 在树状层次结构中找到第一个父级