zoukankan      html  css  js  c++  java
  • IQueryable、IEnumberable 、IList与List区别


    基本概念:

    IEnumerable:使用的是LINQ to Object方式,它会将AsEnumerable()时对应的所有记录都先加载到内存,然后在此基础上再执行后来的Query

    IQeurable(IQuerable<T>):不在内存加载持久数据,因为这家伙只是在组装SQL,(延迟执行) 到你要使用的时候,例如 list.Tolist() or list.Count()的时候,数据才从数据库进行加载 (AsQueryable())。

    IList(IList<T>):泛型接口是 ICollection 泛型接口的子代,作为所有泛型列表的基接口,在用途方面如果作为数据集合的载体这是莫有问题的,只是如果需要对集合做各种的操作,例如 排序 编辑 统计等等,它不行。

    List <> :泛型类,它已经实现了IList <> 定义的那些方法,IList<T> list=new List<T>();只是想创建一个基于接口IList<Class1>的对象的实例,这个接口是由List<T>实现的。只是希望使用到IList<T>接口规定的功能而已



    使用:
    //IList
    IList users = res.ToList(); //此时已把users加载到内存,而每个user的关联实体(UserInfos)未
                                           //被加载,所以下一行代码无法顺利通过
    var ss = users.Where(p => p.UserInfos.ID != 3); //此处报错,因为P的UserInfos实体无法被加载
     
    // IQuerable的
    IQueryable users = res.AsQueryable(); //users未被立即加载,关联实体可通过“延迟加载”获
                                       //得
    var ss = users.Where(p => p.UserInfos.ID != 3);//此处顺利获得对应的ss
    
    

      

    总结:

    基于性能和数据一致性这两点,使用IQueryable时必须谨慎,而在大多数情况下我们应使用IList。

    1.当你打算马上使用查询后的结果(比如循环作逻辑处理或者填充到一个table/grid中),并且你不介意该查询即时被执行后的结果可以供调用者(Consummer)作后续查询(比如这是一个"GetAll"的方法),或者你希望该查执行,使用ToList()
    2.当你希望查询后的结果可以供调用者(Consummer)作后续查询(比如这是一个"GetAll"的方法),或者你希望该查询延时执行,使用AsQueryable()
    3.按照功能由低到高:List<T> IList<T> IQueryable<T> IEnumerable<T>
    4.按照性能由低到高:IEnumerable<T> IQueryable<T> IList<T> List<T>

  • 相关阅读:
    java.nio.channels.ClosedChannelException
    JAVA面试题以及基本hadoop
    one
    在远程桌面集群中——配置Python的环境变量
    双系统——在win10系统保存和查看Ubuntu系统中的文件——Linux Reader
    MySQL——安装
    Python--简单读写csv文件
    Python--画图时希腊字母的显示
    IDL——关系运算符Eq Ne Le Lt Gt Ge
    python——利用scipy.stats import pearsonr计算皮尔逊相关系数
  • 原文地址:https://www.cnblogs.com/YzpJason/p/9520092.html
Copyright © 2011-2022 走看看