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 延迟加载本质(二)的更多相关文章

  1. Entity Framework 程序设计入门二 对数据进行CRUD操作和查询

    前一篇文章介绍了应用LLBL Gen生成Entity Framework所需要的类型定义,用一行代码完成数据资料的读取, <LLBL Gen + Entity Framework 程序设计入门& ...

  2. Entity Framework学习笔记(二)----CRUD(1)

    请注明转载地址:http://www.cnblogs.com/arhat 这篇文章老魏和大家分享一下Entity Framework的CRUD操作,在这之前呢,老魏先说一下老魏对EF的一个整体的认识, ...

  3. Entity Framework笔记(二)

    前几日学习了在VS2010Console项目中使用Entity Framework,并且使用Code First模式.通过编写Model类,来生成数据库对应的表.并且,往表中写入数据以及获取表中的所有 ...

  4. Entity FrameWork 延迟加载的本质(一)

    1.集合的标准查询运算符方法,是来自于System.Linq.Enumerable里给IEnumerable接口添加的扩展方法 2.EF上下文里的DBSet<T>里的标准查询运算符方法,来 ...

  5. Entity Framework框架 (二)

    一.前面一篇EF的介绍主要是通过linq语句,本篇主要是介绍一下不通过linq语句如何去操作EF执行查询sql语句与执行存储过程. 1.  其中的Acccout是输出参数对应的类.比如输出参数有三个值 ...

  6. Code First :使用Entity. Framework编程(5) ----转发 收藏

    第五章 对数据库映射使用默认规则与配置 到目前为止我们已经领略了Code First的默认规则与配置对属性.类间关系的影响.在这两个领域内,Code First不仅影响模型也影响数据库.在这一章,你将 ...

  7. 【译著】Code First :使用Entity. Framework编程(5)

    第五章 对数据库映射使用默认规则与配置 到目前为止我们已经领略了Code First的默认规则与配置对属性.类间关系的影响.在这两个领域内,Code First不仅影响模型也影响数据库.在这一章,你将 ...

  8. LINQ to SQL和Entity Framework

    LINQ to SQL和Entity Framework都是一种包含LINQ功能的对象关系映射技术. 那么为什么会有LINQ这个东西的出现呢. 简单来说LINQ是为了满足不知道怎么操作数据库的程序员开 ...

  9. Entity Framework 项目使用心得

    在博客园很久了,一直只看不说,这是发布本人的第一个博客. 总结一下在项目中,EntityFramework使用的一下经验拿来和大家分享,希望对大家有用~ 1.         在Entity Fram ...

随机推荐

  1. Django 源码小剖: Django ORM 查询管理器

    ORM 查询管理器 对于 ORM 定义: 对象关系映射, Object Relational Mapping, ORM, 是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从 ...

  2. 上海华魏光纤传感科技有限公司 招聘 《.NET研发工程师》

    代友招聘 <.NET研发工程师> **** 公司简介 **** 上海华魏光纤传感技术有限公司成立于2001年,注册资金1458.16万人民币,专业从事光纤传感技术的研究开发,为交通.市政等 ...

  3. Android M Permission 学习笔记

    Android应用权限简要介绍 一个Android应用默认情况下是不拥有任何权限的, 这即是说, 在默认情况下, 一个应用是没有权利去进行一些可能会造成不好影响的操作的. 这些不好的影响可能是对其它应 ...

  4. Linux RPM 命令参数使用详解

    rpm 执行安装包二进制包(Binary)以及源代码包(Source)两种.二进制包可以直接安装在计算机中,而源代码包将会由 RPM自动编译.安装.源代码包经常以src.rpm作为后缀名. 常用命令组 ...

  5. js 事件捕获与事件冒泡例子

    http://codepen.io/huashiyiqike/pen/qZVdag addEventListener 默认是冒泡阶段执行,也就是父亲与子都监听时,点击子,子先处理,父亲再处理,这时加s ...

  6. tmux protocol version mismatch (client 7, server 6)

    $ tmux attach protocol version mismatch (client 7, server 6) $ pgrep tmux 3429 $ /proc/3429/exe atta ...

  7. SSIS:控件清单

    Control Flow 控制流程 Containers 容器 For Loop Container Foreach Loop Container Sequence Container Core Ta ...

  8. Qt编写自定义控件一开关按钮

    从2010年进入互联网+智能手机时代以来,各种各样的APP大行其道,手机上面的APP有很多流行的元素,开关按钮个人非常喜欢,手机QQ.360卫士.金山毒霸等,都有很多开关控制一些操作,在Qt widg ...

  9. WIN7 64位如何添加网络打印机

    http://wenku.baidu.com/view/2d64bef0f61fb7360b4c65ac.html 该文介绍的比较详细,并且我按照他的方法,确实安装成功了.

  10. python 字符串复制

    通过变量来进行赋值 fstr = 'strcpy'sstr = fstrfstr = 'strcpy2'print sstr