预加载和显式加载之间的区别
differences between Eager Loading and Explicit Loading
预加载:
context.Cars.Include(c=>c.Orders)
显式加载:
context.Entry(c).Collection(x => x.Orders).Load();
预加载和显式加载有什么区别?仅仅是语法上的差异,比如 Eager Loading 使用 Include
而 Explicit Loading 使用 Load
吗?但使用 Include
不是也是一种 "explicit" 加载导航属性的方式吗,那么为什么预加载不被认为与显式加载相同?
Eager loading 与 Lazy loading 相反,但 Explicit loading 类似于 lazy loading,不同之处在于:您在代码中显式检索相关数据;当您访问导航 属性 时,它不会自动发生。
您可以通过获取实体的对象状态管理器条目并为集合调用 Collection.Load 方法或为包含单个实体的属性调用 Reference.Load 方法来手动加载相关数据。
EntityFramework returns IQueryable对象,本质上包含对数据库的查询。但是这些直到第一次被枚举时才会执行。
Load() 执行查询,以便将其结果存储在本地。
调用 Load() 与调用 ToList() 并丢弃该 List 相同,没有创建 List 的开销。
预加载加载相关实体作为查询的一部分,即在实际执行查询时加载实体。这与通过导航 属性.
访问相关实体时加载相关实体的延迟加载相反
调用 Load()
显式加载您请求的实体,而不是等待您访问导航属性。例如,当初始查询没有 return 任何相关实体(因为您没有使用预先加载)并且出于任何原因禁用了延迟加载时,它很有用。
预加载:
context.Cars.Include(c=>c.Orders)
显式加载:
context.Entry(c).Collection(x => x.Orders).Load();
预加载和显式加载有什么区别?仅仅是语法上的差异,比如 Eager Loading 使用 Include
而 Explicit Loading 使用 Load
吗?但使用 Include
不是也是一种 "explicit" 加载导航属性的方式吗,那么为什么预加载不被认为与显式加载相同?
Eager loading 与 Lazy loading 相反,但 Explicit loading 类似于 lazy loading,不同之处在于:您在代码中显式检索相关数据;当您访问导航 属性 时,它不会自动发生。
您可以通过获取实体的对象状态管理器条目并为集合调用 Collection.Load 方法或为包含单个实体的属性调用 Reference.Load 方法来手动加载相关数据。
EntityFramework returns IQueryable对象,本质上包含对数据库的查询。但是这些直到第一次被枚举时才会执行。
Load() 执行查询,以便将其结果存储在本地。 调用 Load() 与调用 ToList() 并丢弃该 List 相同,没有创建 List 的开销。
预加载加载相关实体作为查询的一部分,即在实际执行查询时加载实体。这与通过导航 属性.
访问相关实体时加载相关实体的延迟加载相反调用 Load()
显式加载您请求的实体,而不是等待您访问导航属性。例如,当初始查询没有 return 任何相关实体(因为您没有使用预先加载)并且出于任何原因禁用了延迟加载时,它很有用。