Entity FrameWork 延迟加载本质(二)
1.对于外键实体而言,EF会在用到这个外键属性的时候,才会去查对应的表。这就是按需加载了。。。
2.按需加载的缺点:每次调用外键实体的时候,都会去查询数据库(EF有小优化:相同的外键实体只查一次)

IQueryable<StudentDetail> sd=db.StudentDetails; foreach (var item in sd)
{
Console.WriteLine(item.Studnet.s_Name);
}
解决的办法,和平时我们普通使用数据库是一样的,使用内连接inner jion来查询。在EF中要生成这样的语句使用;
db.Students.Include("c_ID"); -->语法是:数据上下文对象的实例.表名.Include("外键名称");
通过Include()方法,可以告诉EF,链接查询哪个外键属性。当有多个外键属性的时候,要链接查询,可以使用多个Include()方法。即db.Students.Include("c_ID").Include("xxx").Include("sss");.....
*使用EF查询方法并结合Select方法,在Select中使用到了实体的外键属性,那么EF会自动生成inner join 语句查询数据库: 如代码:
db.StudentDetails.Where(s => s.u_SID == 1).Select(s => new { aId = s.u_SID, aName = s.Studnet.s_Name }).ToList();
IQueryable<StudentDetail> sd = db.StudentDetails.Include("Studnet"); //这段代码执行完之后,并不会马上生成SQL语句执行查询,即延迟加载,(正是有IQueryable接口,才支持延迟加载),查询的返回结果是IQueryable类型,所以,使用这个类型来接收,当然也可以使用它的子类DbQuery<Studentdetail>类型来接收的。延迟加载正是通过DbQuery这个类来实现的。
//DbQuery<StudentDetail> sd = db.StudentDetails.Include("Studnet");
foreach (var item in sd)
{
//当访问StudentDetail对象里的外键实体时,EF会查询StudentDetail里对应的学生表(Student),查询之后,将数据装入,这个外键实体
Console.WriteLine(item.Studnet.s_Name); //这句执行的时候,才会执行生成SQL(包含Inner join的SQL),执行查询。只生成一次,后面循环再查询的时候,不会再生成。这样就解决了外建延迟加载的缺陷。 }
这样一来,在程序运行的时候,会自动生成inner join 的SQL语句。而我们使用多个外键属性的时候,就不会再去查外键表了。
Entity FrameWork 延迟加载本质(二)的更多相关文章
- Entity Framework 程序设计入门二 对数据进行CRUD操作和查询
前一篇文章介绍了应用LLBL Gen生成Entity Framework所需要的类型定义,用一行代码完成数据资料的读取, <LLBL Gen + Entity Framework 程序设计入门& ...
- Entity Framework学习笔记(二)----CRUD(1)
请注明转载地址:http://www.cnblogs.com/arhat 这篇文章老魏和大家分享一下Entity Framework的CRUD操作,在这之前呢,老魏先说一下老魏对EF的一个整体的认识, ...
- Entity Framework笔记(二)
前几日学习了在VS2010Console项目中使用Entity Framework,并且使用Code First模式.通过编写Model类,来生成数据库对应的表.并且,往表中写入数据以及获取表中的所有 ...
- Entity FrameWork 延迟加载的本质(一)
1.集合的标准查询运算符方法,是来自于System.Linq.Enumerable里给IEnumerable接口添加的扩展方法 2.EF上下文里的DBSet<T>里的标准查询运算符方法,来 ...
- Entity Framework框架 (二)
一.前面一篇EF的介绍主要是通过linq语句,本篇主要是介绍一下不通过linq语句如何去操作EF执行查询sql语句与执行存储过程. 1. 其中的Acccout是输出参数对应的类.比如输出参数有三个值 ...
- Code First :使用Entity. Framework编程(5) ----转发 收藏
第五章 对数据库映射使用默认规则与配置 到目前为止我们已经领略了Code First的默认规则与配置对属性.类间关系的影响.在这两个领域内,Code First不仅影响模型也影响数据库.在这一章,你将 ...
- 【译著】Code First :使用Entity. Framework编程(5)
第五章 对数据库映射使用默认规则与配置 到目前为止我们已经领略了Code First的默认规则与配置对属性.类间关系的影响.在这两个领域内,Code First不仅影响模型也影响数据库.在这一章,你将 ...
- LINQ to SQL和Entity Framework
LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术. 那么为什么会有LINQ这个东西的出现呢. 简单来说LINQ是为了满足不知道怎么操作数据库的程序员开 ...
- Entity Framework 项目使用心得
在博客园很久了,一直只看不说,这是发布本人的第一个博客. 总结一下在项目中,EntityFramework使用的一下经验拿来和大家分享,希望对大家有用~ 1. 在Entity Fram ...
随机推荐
- Django 源码小剖: Django ORM 查询管理器
ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从 ...
- 上海华魏光纤传感科技有限公司 招聘 《.NET研发工程师》
代友招聘 <.NET研发工程师> **** 公司简介 **** 上海华魏光纤传感技术有限公司成立于2001年,注册资金1458.16万人民币,专业从事光纤传感技术的研究开发,为交通.市政等 ...
- Android M Permission 学习笔记
Android应用权限简要介绍 一个Android应用默认情况下是不拥有任何权限的, 这即是说, 在默认情况下, 一个应用是没有权利去进行一些可能会造成不好影响的操作的. 这些不好的影响可能是对其它应 ...
- Linux RPM 命令参数使用详解
rpm 执行安装包二进制包(Binary)以及源代码包(Source)两种.二进制包可以直接安装在计算机中,而源代码包将会由 RPM自动编译.安装.源代码包经常以src.rpm作为后缀名. 常用命令组 ...
- js 事件捕获与事件冒泡例子
http://codepen.io/huashiyiqike/pen/qZVdag addEventListener 默认是冒泡阶段执行,也就是父亲与子都监听时,点击子,子先处理,父亲再处理,这时加s ...
- tmux protocol version mismatch (client 7, server 6)
$ tmux attach protocol version mismatch (client 7, server 6) $ pgrep tmux 3429 $ /proc/3429/exe atta ...
- SSIS:控件清单
Control Flow 控制流程 Containers 容器 For Loop Container Foreach Loop Container Sequence Container Core Ta ...
- Qt编写自定义控件一开关按钮
从2010年进入互联网+智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ.360卫士.金山毒霸等,都有很多开关控制一些操作,在Qt widg ...
- WIN7 64位如何添加网络打印机
http://wenku.baidu.com/view/2d64bef0f61fb7360b4c65ac.html 该文介绍的比较详细,并且我按照他的方法,确实安装成功了.
- python 字符串复制
通过变量来进行赋值 fstr = 'strcpy'sstr = fstrfstr = 'strcpy2'print sstr