zoukankan      html  css  js  c++  java
  • Linq之IQueryable接口与IEnumberable区别

    IEnumerable接口

    公开枚举器,该枚举器支持在指定类型的集合上进行简单迭代。也就是说:实现了此接口的object,就可以直接使用foreach遍历此object;

     IEnumerable 包含一个方法,GetEnumerator,返回 IEnumerator。 IEnumerator 可以通过集合循环显示 Current 属性和 MoveNext 和 Reset 方法。
    它是一个最优方法实现 IEnumerable 和 IEnumerator 在集合选件类启用 foreach (For Each 在 Visual Basic 中为) 语法,但是,IEnumerable 不需要实现。 如果集合中不实现 IEnumerable,您还必须遵循迭代器窗体通过提供返回接口、选件类或结构的 GetEnumerator 方法支持此语法。

    IQueryable 接口

    IQueryable 接口继承 IEnumerable 接口,以便在前者表示一个查询时可以枚举该查询的结果。 枚举强制执行与 IQueryable 对象关联的表达式目录树。 “执行表达式目录树”的定义是查询提供程序所特有的。实现IQueryable接口可以实现自己的查询提供程序。

    那么他们的区别到底在哪儿呢?下面看一个例子:

     1 namespace Wolfy.LinqDemo
     2 {
     3     class Program
     4     {
     5         static void Main(string[] args)
     6         {
     7             using (UserInfoDataContext context = new UserInfoDataContext())
     8             {
     9               
    10                 //查询的结果放入IQueryable接口的集合中
    11                 IQueryable<TB_UserInfo> userInfoQuery= (from u in context.TB_UserInfos
    12                                                          orderby u.ID
    13                                                          select u).Skip<TB_UserInfo>(3).Take<TB_UserInfo>(3);
    14                 //注意这个AsEnumerable<T_Class>()在分页查询之前,先将其转换成IEnumerable类型
    15                 IEnumerable<TB_UserInfo> userInfoEnum = (from u in context.TB_UserInfos
    16                                                          orderby u.ID
    17                                                          select u).AsEnumerable<TB_UserInfo>().Skip<TB_UserInfo>(3).Take<TB_UserInfo>(3);
    18                 //执行查询
    19                 int i = 0;
    20                 foreach (var item in userInfoQuery)
    21                 {
    22                     i++;
    23                 }
    24                 foreach (var item in userInfoEnum)
    25                 {
    26                     i++;
    27                 }
    28                 Console.WriteLine("OK");
    29                 Console.Read();
    30             }
    31         }
    32     }
    33 }

    直接返回IQueryable接口生成的sql语句

    第二种:在用分页查询之前先将其转换成 IEnumerable实际执行的sql如下图所示

    总结

        IEnumerable<T> 泛型类在调用自己的SKip  Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T> 是将Skip ,take 这些方法表达式翻译成T-SQL语句之后再向SQL服务器发送命令。也是延迟在我要真正显示数据的时候才执行。
     
    参考文章
    https://msdn.microsoft.com/zh-cn/library/system.linq.iqueryable.aspx
    https://msdn.microsoft.com/zh-cn/library/system.collections.ienumerable.aspx
    http://www.cnblogs.com/chengxiaohui/articles/2088837.html
  • 相关阅读:
    java的多线程学习,第二记
    java多线程的学习
    长城
    2018-12-6
    mysql的笔记
    springboot用jpa生成表,没有外键
    idea 使用方法
    Oracle数据库中文乱码问题
    JAVA-Could not create the Java virtual machine java启动失败
    log4j日志如何在ssh中配置?
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/3217514.html
Copyright © 2011-2022 走看看