zoukankan      html  css  js  c++  java
  • Entity FrameWork 延迟加载本质(二)

    1.对于外键实体而言,EF会在用到这个外键属性的时候,才会去查对应的表。这就是按需加载了。。。

    2.按需加载的缺点:每次调用外键实体的时候,都会去查询数据库(EF有小优化:相同的外键实体只查一次)

    1             IQueryable<StudentDetail> sd=db.StudentDetails;3             foreach (var item in sd)
    4             {
    5                Console.WriteLine(item.Studnet.s_Name);
    6             }

    解决的办法,和平时我们普通使用数据库是一样的,使用内连接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语句。而我们使用多个外键属性的时候,就不会再去查外键表了。

  • 相关阅读:
    开源项目:张帅个人博客
    django url映射的时候指定默认参数
    django 自定义url转换器
    django跳转页面传参
    django中're_path'的用法
    url详解
    django 用户与权限管理
    Python项目搬迁,快捷导出环境依赖包到requirements.txt
    centos安装python3.7
    更换国内pip
  • 原文地址:https://www.cnblogs.com/caofangsheng/p/4525664.html
Copyright © 2011-2022 走看看