EF学习和使用(六)显式加载、按需加载
2015-09-28 22:39
323 查看
这篇博客接着说EF加载数据的方式,今天介绍剩下的两种:显式加载和按需加载。
显式加载(Explicit Loading)
显式加载和延迟加载非常类似,不同的是显式加载要手动关闭EF的延迟加载属性,通过代码ctx.Configuration.LazyLoadingEnabled = false;来完成。
通过在SQL Server Profiler中的跟踪记录可以看到一共执行了4次对Order表的查询。显式加载的意义就在于我们可以通过添加判断条件,对数据加载方式进行控制,从而有效地减少程序与数据库交互的次数。大多数情况下,我们从数据库获取到的数据并不都是需要的,如果每次只有很少一部分数据有用,那么我们为什么不过滤掉那些无用的数据从而尽量较少数据交互的次数呢?
按需加载
其实EF并不存在按需加载的概念,但是这种方式很值得说一说,在加载数据的时候并不是需要所有的属性值,可能只需要一个Id,Name值。所以我们可以对要查询的实体进行一下筛选,只加载自己需要的某些列,避免加载大量的垃圾数据。在这里按需加载的概念只是加载需要的列。可能会与前端开发中 的概念“按需加载”有所冲突。
现在EF所谓的四种加载数据的方式都已经介绍完了, 相信大家对这几种方式都有了一定的认知,知道了在什么情况下使用何种方式较好。就像前面所说,选择什么样的数据加载方式需要因时而异,每一种数据加载方式都有它存在的意义,但目的只有一个,那就是以最小的代价获取到需要的数据。
显式加载(Explicit Loading)
显式加载和延迟加载非常类似,不同的是显式加载要手动关闭EF的延迟加载属性,通过代码ctx.Configuration.LazyLoadingEnabled = false;来完成。
using (var dbcontext= new ModelFirstDemoEntities()) { dbcontext.Configuration.LazyLoadingEnabled = false; #region 显式加载:查询部分列数据,前提关闭 懒加载 //查询表中部分列的数据 var items = from c in dbcontext.Customer select c; foreach (var item in items) { //条件判断,只加载满足条件的数据,减少访问数据库的次数 if (item.Id < 5) { dbcontext.Entry(item).Collection(c => c.Order).Load(); Console.WriteLine(item.CusName); } foreach (var order in item.Order) { Console.WriteLine("Course name : {0}", order.OrderContent); } } #endregion }
通过在SQL Server Profiler中的跟踪记录可以看到一共执行了4次对Order表的查询。显式加载的意义就在于我们可以通过添加判断条件,对数据加载方式进行控制,从而有效地减少程序与数据库交互的次数。大多数情况下,我们从数据库获取到的数据并不都是需要的,如果每次只有很少一部分数据有用,那么我们为什么不过滤掉那些无用的数据从而尽量较少数据交互的次数呢?
按需加载
其实EF并不存在按需加载的概念,但是这种方式很值得说一说,在加载数据的时候并不是需要所有的属性值,可能只需要一个Id,Name值。所以我们可以对要查询的实体进行一下筛选,只加载自己需要的某些列,避免加载大量的垃圾数据。在这里按需加载的概念只是加载需要的列。可能会与前端开发中 的概念“按需加载”有所冲突。
#region 按需加载:查询部分列数据 //查询表中部分列的数据 var items = from c in dbcontext.Customer where c.Id < 10 select new { Id = c.Id, CName = c.CusName, OrderCount = c.Order.Count() }; foreach (var item in items) { Console.WriteLine(item.CName); } #endregion
现在EF所谓的四种加载数据的方式都已经介绍完了, 相信大家对这几种方式都有了一定的认知,知道了在什么情况下使用何种方式较好。就像前面所说,选择什么样的数据加载方式需要因时而异,每一种数据加载方式都有它存在的意义,但目的只有一个,那就是以最小的代价获取到需要的数据。
相关文章推荐
- Linux中如何杀掉僵尸进程
- 使用EF框架的增删改查和分页的公共类
- 对一个或多个实体的验证失败。有关详细信息,请参见“EntityValidationErrors”属性。
- entity framework的配置步骤
- MVC中“The model backing the '***Context' context has changed since the database was created. ”的问题处理
- vs2012通过EF连接mysql数据库全程
- EF code-first 数据迁移
- 更新条目时出错。有关详细信息,请参见内部异常 错误原因
- EF6.0 生成的代码中没有注释的解决方法
- 在使用EF时,想要比较字符串类型的日期时
- EF code first attribute
- Windows服务之EF加载数据
- 从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值。
- 如何知道错误:Validation failed for one or more entities. See 'EntityValidationErrors' 的原因
- EF-增删改查简单示例
- 用EF实现多条件查询
- 一种基于EF+MVC的小型系统快速开发架构
- ASP.NET MVC+Entity Framework 4.1访问数据库 (EF)
- 利用Migration同步模型与数据库的字段
- EF添加和附加实体对象的状态