解析ASP.NET Mvc开发之EF延迟加载 分类: ASP.NET 2014-01-04 01:29 4017人阅读 评论(1) 收藏
目录:
-------------------------------------------------------------------------------------------------------
哈哈,既然学习EF,怎么可能不涉及到EF的延迟加载特性呢!那么到底什么是EF的延迟加载呢?这篇文章我们就来看看。
EF延迟加载:就是使用Lamabda表达式或者Linq 从 EF实体对象中查询数据时,EF并不是直接将数据查询出来,而是在用到具体数据的时候才会加载到内存。
一,实体对象的Where方法返回一个什么对象?
大家来看一下上一篇文章的代码来分析一下:
region 查询文章列表+ActionResult Article()
/// <summary>
/// 查询文章列表
/// </summary>
/// <returns></returns>
public ActionResult Article()
{
//通过db对象获取文章列表
db.BlogArticles.Where(p => p.AIsDel == false);//使用Lamabda表达式来获取为被删除的文章 //使用Lamabda表达式来获取数据
//返回一个List<T>的对象来存储文章列表
List < Models.BlogArticle > list= db.BlogArticles.Where(p => p.AIsDel == false).ToList(); //也可以使用Linq来获取数据
List<Models.BlogArticle> list1 = (from p in db.BlogArticles where p.AIsDel == false select p).ToList(); //使用ViewData来传递list对象
ViewData["DataList"] = list; return View();
}
#endregion
为了体验延迟加载,我们把代码做修改如下:
#region 查询文章列表+ActionResult Article()
/// <summary>
/// 查询文章列表
/// </summary>
/// <returns></returns>
public ActionResult Index()
{
//通过db对象获取文章列表
db.BlogArticles.Where(p => p.AIsDel == false);//使用Lamabda表达式来获取为被删除的文章 DbQuery<Models.BlogArticle> query = (db.BlogArticles.Where(p => p.AIsDel == false)) as DbQuery<Models.BlogArticle>; List<Models.BlogArticle> list = query.ToList();
//使用ViewData来传递list对象
ViewData["DataList"] = query; return View();
}
#endregion
在这里我们为什么要使用DbQuery<T>来接收呢?
首先我们来看使用db.BlogArticles.Where()来获取文章列表的时候,Where()方法给我们返回一个什么类型的对象呢?我们把鼠标放在Where()方法上后,会发现Where会返回给我们一个IQueryable的泛型接口对象,如下图:

那我们是不是需要使用IQueryable对象来接收获取的对象呢,代码如下:
//where()方法返回一个IQuery的接口
IQueryable < Models.BlogArticle > query= db.BlogArticles.Where(p => p.AIsDel == false);
这里的Query到底能不能取到值呢?我们来运行调试程序,结果如下:

我们在局部变量窗口看到Query已经取到了值。但是根据面向对象的原则,接口是不能直接实例化的,但是这里的代码又是不报错的,那是为什么呢?
根据面向对象的里氏替换原则,我们都知道,这里实际上是返回了一个IQueryable对象的子类对象。
注意:C#里氏替换原则,子类对象可以赋值给父类对象。也就是说子类可以替换父类出现的地方。但是父类对象一定不可以替换子类对象。
也就是说Where()方法返回了一个IQueryable接口的子类对象,并且赋值给了它的父类对象IQueryable。
那么Where()到底返回了一个什么样的对象呢(什么样的IQueryable的子类对象呢)?
再次看上面的局变量窗口中query的返回值类型为,如下图:

我们可以很明显的看出,query的返回类型为DbQuery类型。
那我们就用DbQuery来接收对象,代码如下:
DbQuery<Models.BlogArticle> query = (db.BlogArticles.Where(p => p.AIsDel == false)) as DbQuery<Models.BlogArticle>;
因为Where()方法返回的是IQueryable对象,所以要把对象转换成DbQuery对象;
二,DbQuery<T>泛型接口类的延迟加载
上面的定义已经说过了EF延迟加载的定义,那么在这里我们在query查询到对象时,数据库有没有执行查询操作呢?
这里我们借助Sql Server的自身的Profiler软件来查看,
①打开Sql Server Profiler 软件,新建一个查询,刚开始,是有查询记录的,如下图:

②我们使用上图中的,红色箭头指的橡皮,清除一下记录,如下图:

③我们再次启动调试,运行代码,当程序运行到断点的时候,我们看到query还没有值,如下图:

④单步调试,进行下一步,我们在局部变量窗口中发现query已经取到了值,如下图:

query的值,如下图:

那么我们的Sql Server Profiler 跟踪器发生了什么变化呢?没有发生任何变化,如下图:

我们如果使用ADO.NET操作数据库,查询完数据后,数据会立即送给接收的对象(比如:DataTable对象),但是EF操作数据库怎么却没有立即去查询数据呢?
⑤DbQuery对象的延迟加载
当我们使用query对象的时候才回去查询数据库,我们继续执行下一步,结果如下:

这个时候list取到了值,然后Sql Server Profiler 也发生了变化,有了查询数据库的记录,如下图:

也就是说,当query对象ToList()的时候,才发生了查询数据库的操作。
三,总结:
1)EF中的DbQuery对象操作数据库的时候发生延迟加载,而直接使用List<T>来接受对象时则不会;
2)延迟加载不会立即去查询数据库,而是在使用数据的时候才EF才会去查询数据库。
毕业实习交流群:221376964。你也可以关注我的新浪微博进行交流。

版权声明:本文为博主原创文章,未经博主允许不得转载。
解析ASP.NET Mvc开发之EF延迟加载 分类: ASP.NET 2014-01-04 01:29 4017人阅读 评论(1) 收藏的更多相关文章
- 解析ASP.NET Mvc开发之EF延迟加载
目录: 1)从明源动力到创新工场这一路走来 2)解析ASP.NET WebForm和Mvc开发的区别 3)解析ASP.NET Mvc开发之查询数据实例 ------------------------ ...
- ASP.NET Mvc开发之EF延迟加载
EF延迟加载:就是使用Lamabda表达式或者Linq 从 EF实体对象中查询数据时,EF并不是直接将数据查询出来,而是在用到具体数据的时候才会加载到内存. 一,实体对象的Where方法返回一个什么对 ...
- android开发之broadcast学习笔记 分类: android 学习笔记 2015-07-19 16:33 32人阅读 评论(0) 收藏
android中的广播用的太多了,今天稍微总结一下. 按注册方式分为两种: 1.静态注册广播: 静态注册广播就是在androidManifest.xml文件中注册广播,假设我们要实现这样一个效果,在一 ...
- android开发之this.finish()的使用 分类: android 学习笔记 2015-07-18 19:05 30人阅读 评论(0) 收藏
在一个Activity用完之后应该将之finish掉,但是,之前在学校里自己摸索着开发时并没有太注意这个问题,因为activity无论是否finish掉对功能的影响貌似都不是那么明显(这是读书时候的观 ...
- android开发之AlertDialog点击按钮之后不消失 分类: android 学习笔记 2015-07-15 18:07 89人阅读 评论(0) 收藏
最近有这样一个需求,我需要用户在一个弹出框里输入密码来验证,验证成功当然好说,但是如果验证失败则需要把alertdialog的标题改为"密码错误,请重新输入",并且这个alertd ...
- UI基础:视图控制器.屏幕旋转.MVC 分类: iOS学习-UI 2015-07-02 22:21 62人阅读 评论(0) 收藏
UIViewController 视图控制器,继承自UIResponder,作用:管理视图并且响应事件 功能: 1.分担APPdelegate的工作 2.实现模块独立,能提高复用性 创建UIViewC ...
- 全面解析sizeof(下) 分类: C/C++ StudyNotes 2015-06-15 10:45 263人阅读 评论(0) 收藏
以下代码使用平台是Windows7 64bits+VS2012. sizeof作用于基本数据类型,在特定的平台和特定的编译中,结果是确定的,如果使用sizeof计算构造类型:结构体.联合体和类的大小时 ...
- 全面解析sizeof(上) 分类: C/C++ StudyNotes 2015-06-15 10:18 188人阅读 评论(0) 收藏
以下代码使用平台是Windows7 64bits+VS2012. sizeof是C/C++中的一个操作符(operator),其作用就是返回一个对象或者类型所占的内存字节数,使用频繁,有必须对齐有个全 ...
- 解析ASP.NET Mvc开发之删除修改数据 分类: ASP.NET 2014-01-04 23:41 3203人阅读 评论(2) 收藏
目录: 从明源动力到创新工场这一路走来 解析ASP.NET WebForm和Mvc开发的区别 解析ASP.NET 和Mvc开发之查询数据实例 解析ASP.NET Mvc开发之EF延迟加载 ------ ...
随机推荐
- HDU 2058 The sum problem (数学+暴力)
题意:给定一个N和M,N表示从1到N的连续序列,让你求在1到N这个序列中连续子序列的和为M的子序列区间. 析:很明显最直接的方法就是暴力,可是不幸的是,由于N,M太大了,肯定会TLE的.所以我们就想能 ...
- PHP中的mb_convert_encoding与iconv函数介绍
php传输乱码 mb_convert_encoding这个函数是用来转换编码的.原来一直对程序编码这一概念不理解,不过现在好像有点开窍了. 不过英文一般不会存在编码问题,只有中文数据才会有这个问题.比 ...
- afx_msg解释
以前一直不知道AFX_MSG是什么意思,只是觉得它应该是个消息映射函数,但是具体代表什么意思,会返回一个什么样的值是一点都不清楚,今天查了下资料,把查到的东西放这,以免以后忘了还得再查. 在头文件(D ...
- 团队项目(第四周冲刺之二)—GG队
项目冲刺: 队员 学号 叶尚文(队长) 3116008802 蔡晓晴 3216008808 杜婷萱 3216008809 龙剑初 3116004647 于泽浩 3116004661 (先把帅气的合照不 ...
- vc6.0 PK vs2010
从VC++6.0不足看VisualC++2010新特性 说起VC,有人想到维生素C(维C),有人想到风险投资(venture capital), 程序员们尤其是做底层开发的程序员或老程序员们第一感觉肯 ...
- RandomForest in Spark MLLib
决策树类模型 ml中的classification和regression主要基于以下几类: classification:决策树及其相关的集成算法,Logistics回归,多层感知模型: regres ...
- openfire消息发送
找了一些demo,做了一些示例,演示了基于xmpp协议的openfire的客户端之间消息的发送. 代码需要两个包,smack.jar ,smackx.jar. 第一个代码,只是点对点发送消息的,不涉及 ...
- 学习sqlserve的一些笔记
创建表: create table 表名 { //定义列名 id ,) primary key,//自动编号:从1开始每次增长1,约束:主键约束 name ) not null //非空约束 } 表数 ...
- AI_ 视频监控-人体移动捕捉监测
总目录地址:AI 系列 总目录 需要最新源码,或技术提问,请加QQ群:538327407 我的各种github 开源项目和代码:https://github.com/linbin524 需求 为了实现 ...
- HTTP响应状态码说明
当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(Server Header)用以响应浏览器的请求. HTTP状态码共分为五种类型: 1**:信息,服务器接收到请求,需 ...