zoukankan      html  css  js  c++  java
  • IQueryable与IQEnumberable的区别

    IEnumberable接口:

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

    IQueryable接口:

        它继承IEnumerable接口,而因为.net版本加Linq和IQueryable后,使得IEnumberable不再那么单调,变得更加强大和丰富。为了区别这两个接口,我们通过一个例子来解释一下。

    编写的代码如下:

     static void Main(string[] args)
            {
                //创建数据库访问接口
                using (HotalDataBaseEntities hotalEntities = new HotalDataBaseEntities())
                { 
                   //查询的结果放入IQueryable接口的集合中
                    IQueryable<Room> roomIQue = (from c in hotalEntities.Room
                                                 orderby c.RoomNum
                                                 select c).Skip<Room>(3).Take<Room>(3);
                    //注意在这个AsEnumerable<Room>()在分页查询之前,先将其转换成IEnumerable类型
                    IEnumerable<Room> roomIEnu = (from c in hotalEntities.Room
                                                  orderby c.RoomNum
                                                  select c).AsEnumerable<Room>().Skip<Room>(3).Take<Room>(3);
                     //因为启用了延迟加载机制,所惟下面调用一下,才会真正去读取数据库
                    int i = 0;
                    foreach (var c in roomIQue)
                    {
                        i++;
                    }
                    Console.WriteLine(i);
                    foreach (var c in roomIEnu)
                    {
                        i++;
                    }
                    Console.WriteLine(i);
                }
                Console.WriteLine("运行完毕");
                Console.ReadKey();
    
            }

    注意红色代码部分,在用Linq查询实体集合之前我先将其转换成IEnumerable接口类型,看看最终执行sql是怎样的。

    第一种:直接返回IQueryable类型的查询,如下图所示:

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

    总结:

       IQueryable接口与IEnumberable接口的区别:IEnumerable<T>泛型类在调用自己的Skip和Take等扩展方法之前数据就已经加载到本地内存里面,而IQueryable<T>是将Skip,Take这些方表达式翻译成T_sql语句之后再向Sql服务器发送命令,它并不是把所有的数据都加载到内存里来才进行条件过滤。

  • 相关阅读:
    龟兔赛跑(多线程练习题)
    进程和线程详解
    toString()方法详解
    使用IDEA的Git插件上传项目教程
    js运算符单竖杠“|”的用法和作用及js数据处理
    vue项目axios请求接口,后端代理请求接口404,问题出现在哪?
    jQuery的ajax的post请求json格式无法上传空数组
    es6 学习小记 扩展运算符 三个点(...)
    select2插件使用小记2
    js中多维数组转一维
  • 原文地址:https://www.cnblogs.com/q4486233/p/hg_aspnet.html
Copyright © 2011-2022 走看看