IQueryable接口与IEnumerable接口比较

         今天写代码的时候调到IQueryable里面看它的方法,发现它是实现IEnumerable接口的,then i'm confused!

       

              要区分他俩还是先写段代码来看看吧~

                 我们拿出以前那个练习EF增删改查的代码改一改:

           

  #region 查询单个实体

            using (var dbContext = new SecondChargeEntities())//先创建访问数据库的入口
            {
                //var mystudent = dbContext.T_StuInfo.Find("01");//使用主键查找上下文跟踪的实体

                //Console.WriteLine(mystudent.StuName);  //打印出学生姓名:杰伦哥哥

                //查询的结果放到Iqueryable接口的集合中
                IQueryable<T_StuInfo> stus = (from stu in dbContext.T_StuInfo orderby stu.StuCardNum select stu).Skip<T_StuInfo>(3).Take<T_StuInfo>(3);

                //我们在skip之前,先将查询到的结果用asEnumerable转化成ienumerable
                IEnumerable<T_StuInfo> mystus = (from stu in dbContext.T_StuInfo orderby stu.StuCardNum select stu).AsEnumerable < T_StuInfo>().Skip<T_StuInfo>(3).Take<T_StuInfo>(3);

                //因为启用了延迟加载机制,所以下面调用时,才会真正的去读取DB
                int i = 0;
                foreach (var s in stus)
                {
                    i++;
                }

                Console.WriteLine(i );

                int j = 0;
                foreach (var stu in mystus )
                {
                    j++;
                }

                Console.WriteLine(j);

            }

            Console.WriteLine("宝贝儿,读完了,看看SQL profiler说啥~~");
            Console.ReadKey();

            #endregion

      运行完成之后:

     

      接下来让我们从最底层看看,这两种查询方式的底层SQL语句到底是什么样子滴:

         首先是IQueryable接口:

      

       可以看出,真正查询的时候,是select top 3..然后一坨别的什么东西,估计直接查询出我想要的那三条数据;

      然后再来看看IEnumerable接口查询时生成的是什么样子的SQL:

    

    

      OMG,这个查询的时候居然是全查,然后加载进小内存然后从小内存中返回我想要的3条结果。

    从这两行代码中,我们可以看出:

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

      

         小结:

                            现在,让我们从功能上总结下这两个接口的优缺点:

              

时间: 2024-10-03 19:02:54

IQueryable接口与IEnumerable接口比较的相关文章

C#中IEnumrator的枚举数和IEnumerable接口

声明IEnumerator的枚举数 要创建非泛型接口的枚举数,必须声明实现IEnumerator接口的类,IEnumerator接口有如下特性: 1.她是System.Collections命名空间的成员 2.它包含3个方法Current.MoveNext和Reset 例如:下面代码实现了一个列出颜色名数组的枚举数类: using System.Collections; class ColorEnumerator:IEnumerator { string [] Colors; int Posit

构建可反转排序的泛型字典类(5)--实现IEnumerable接口

5. 实现IEnumerable<KeyValuePair<TKey, TValue>>接口 我们先来看看ReversibleSortedList类的定义: public class ReversibleSortedList<TKey, TValue> : IDictionary<TKey, TValue>, ICollection<KeyValuePair<TKey, TValue>>, IEnumerable<KeyValu

泛型,IEnumerable接口 ,处理遍历的问题。

问题描述 有这么一个题目,关于树形遍历的问题,我不太理解泛型,IEnumerable<T>,IEnumerable接口在其中的作用,以及能做什么不知道可否讲解一下,这个题的思路,以及大致的解题思路.谢谢了.题目如下:usingSystem;usingSystem.Collections;usingSystem.Collections.Generic;namespaceConsoleApplication2{//说明://以下为一个树的节点的定义,假定:除了需要填写的代码外,其他属性和方法均已实

你可能不知道的陷阱, IEnumerable接口

  1.  IEnumerable 与  IEnumerator          IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的for循环写得心烦,foreach就顺畅了很多.          IEnumerable只有一个抽象方法:GetEnumerator(),而IEnumerator又是一个迭代器接口,真正实现了访问集合的功能.  IEnumerator只有一个Current属性,两个方法Mov

没有实现IEnumerable接口怎么也有Getenumerator()?

问题描述 classProgram{publicIEnumeratorGetEnumerator(){yieldreturn"PKU";yieldreturn"SCU";}staticvoidMain(string[]args){Programp=newProgram();foreach(stringiinp){Console.WriteLine(i);}Console.ReadKey();}}如果把GetEnumerator()换个名字,foreach语句那就会说

如何用IEnumerable接口去除数组里面的重复项

问题描述 有个数组,我调用了Distinct方法返回序列中非重复的元素,但是没有用,请问下是不是要实现IEnumerable接口才能清除数组里面的重复项?(最好举例说明下如何实现这个接口) 解决方案 解决方案二:该回复于2010-05-14 07:59:53被版主删除解决方案三:友情帮顶下!顺便学习学习!解决方案四:IEnumerable<String>distinctList=numberList.Distinct();

ListBox的Items不支持IEnumerable接口吗?

问题描述 ListBox.ObjectCollection类:publicclassObjectCollection:IList,ICollection,IEnumerable不是写了ObjectCollection实现了IEnumerable接口的吗?那为什么不能用Where方法listBox20.Items.Where(x=>.....)//为什么不能用? 解决方案 解决方案二:你引用linq命名空间了么?where方法是作为扩展方法添加到Enumerable里面的解决方案三:publics

关于php 接口问题(php接口主要也就是运用curl,curl函数)

本篇文章是对php中的接口问题(php接口主要也就是运用curl,curl函数)进行了详细的分析介绍,需要的朋友参考下   接口问题php调用接口最主要的就是使用curl抓取信息 复制代码 代码如下: $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); //url地址 curl_setopt($ch, CURLOPT_POST, true); //是否post请求 curl_setopt($ch, CURLOPT_POSTFIELDS,

硬盘SCSI接口和SAS接口的区别详解

  SAS的接口技术可以向下兼容SATA.具体来说,二者的兼容性主要体现在物理层和协议层的兼容.在物理层,SAS接口和SATA接口完全兼容,SATA硬盘可以直接使用在SAS的环境中,从接口标准上而言,SATA是SAS的一个子标准,因此SAS控制器可以直接操控SATA硬盘,但是SAS却不能直接使用在SATA的环境中,因为SATA控制器并不能对SAS硬盘进行控制;在协议层,SAS由3种类型协议组成,根据连接的不同设备使用相应的协议进行数据传输.其中串行SCSI协议(SSP)用于传输SCSI命令;SC