• (2017/1/18)EF crud 复习和 延迟加载-贪婪加载


    一、Crud复习

    // 首先创建一个上下文:
    BlogDBEntities blog = new BlogDBEntities(); 
    
    //增加
    UserState user = new UserState();
    user.name = "失效"; blog.UserState.Add(user);
    //修改 UserState state = (from s in blog.UserState where s.id == 1 select s).FirstOrDefault(); state.name = "修改"; //当然也可以这样写 blog.UserState.Attach(state); blog.Entry(state).State = System.Data.EntityState.Modified; //删除 blog.UserState.Remove(state); //查询 //使用lambda表达式查询单个对象 UserState u = blog.UserState.Where(s => s.id == 1).FirstOrDefault(); //查询全部对象 IQueryable<UserState> userStates = blog.UserState; //使用Linq查询单个对象 var states = from state in blog.UserState where state.id == 2 select state; //查询全部 IQueryable<UserState> userState=from state in blog.UserState select state;

    二、EF延迟加载

          延迟加载:只在需要的时候加载数据,不需要预先计划,避免了各种复杂的外连接、索引、视图操作带来的低效率问题

          延迟加载原因:IQueryable这个接口是造成延迟加载的原因。接口里面的三个属性:

                              Type ElementType { get; } 、Expression Expression { get; }、IQueryProvider Provider { get; }

                              Expression:一个表达式,会存储拼接表达式树,直到在运行期最终执行。那么在EF中我们根据条件查询数据时,不应该把数据一次性加载到本地内存中,然后再本地内存中进行筛选,如果数据量大了,就崩溃了。我们需要将表达式组合好,然后再一起提交到数据库执行,返回查询结果。                

    (每次在执行where查询操作符的时候IQueryProvider会为我们创建一个新的IQueryable<T>,调用AsEnumerable()方法的时候并不会去实际取值,只是

    得到了一个IEnumerable,所以EF在查询数据时候不要先取IEnumerable再去筛选数据。执行ToList方法时才会去真正调用迭代器GetEnumerator()

    取值。真正取值时候,会去执行IQueryProvider中的Excute方法.(解析表达式,然后执行取得结果))

    第一种延迟加载:
    IQueryable < UserState > userStates = blog.UserState;//因为使用IQueryable接口的缘故,所以此处延迟加载,执行完这行代码后userStates里面并没有返回的结果集 foreach (var item in userStates)//编译器执行到in这个地方的时候才将结果集赋值给userStates { Console.WriteLine(item.id + "状态:" + item.name + "" + item.UserInfo.Count + ""); //item.UserInfo.Count:为什么会得到UserInfo的数据呢?这就是第二种延迟加载情况了 }

    第二种延迟加载:
    就像上面的item.UserInfo.Count能获取到UserInfo中的信息,虽然说我们Linq表达式中并未查询Order表中的数据,但是当执行到这个地方的时候,EF会自动为我们去查询。

    延迟加载的优点与缺点:

    优点:只在需要的时候加载数据,不需要预先计划,避免了各种复杂的外连接、索引、视图操作带来的低效率问题。

    缺点:多次与数据库进行交互,性能降低,无法实现Web中的缓存。

    三、EF贪婪加载

         贪婪加载:就是把所有的数据直接加载出来

    List<UserState> userState=(from s in UserStateselect s).ToList();

    优点以及缺点:

    优点:减少数据访问的延迟,在一次数据库的访问中返回所有的数据。
    缺点:一次性读取所有相关的数据,可能导致部分数据实际无需用到,从而导致读取数据的速度变慢,效率变低

    :以上代码使用的是EF5.0

  • 相关阅读:
    函数二 10
    函数初识 09
    文件操作 08
    数据类型的补充 day07
    小数据池 深浅copy 集合
    python Mysql 多条件查询
    ElasticSearch Python 基本操作
    用PyInstaller把Python代码打包成单个独立的exe可执行文件
    python 编译EXE文件
    Git 创建新分支检查分支
  • 原文地址:https://www.cnblogs.com/whbk/p/6297108.html
Copyright © 2020-2023  润新知