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-12 21:00:37

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

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

IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的for循环写得心烦,foreach就顺畅了很多. 我很喜欢这个接口,但在使用中也遇到不少的疑问,你是不是也有与我一样的困惑: (1) IEnumerable 与  IEnumerator到底有什么区别 (2) 枚举能否越界访问,越界访问是什么后果?为什么在枚举中不能改变集合的值? (3) Linq的具体实现到底是怎样的,比如Skip,它跳过了一些元素,那么这些

IEnumerable接口的扩展方法

/// <summary>/// IEnumerable接口的扩展方法,支持它的实现类是List的情况/// </summary>using System.Collections.Generic;public static class IEnumerableExtensions{ /// <summary> /// 向集合中添加元素 /// </summary> /// <typeparam name="T"></typ

C# 常用接口学习 IEnumerable&lt;T&gt;

C# 常用接口学习 IEnumerable<T> 作者:乌龙哈里 时间:2015-10-24平台:Window7 64bit,Visual Studio Community 2015 本文参考: MSDN IEnumerable<T> Interface MS DotNet 源代码 你曾实现过二叉树吗--匠心十年 你可能不知道的陷阱, IEnumerable接口--沙漠之鹰 本文章节: 正文: 本文是作者摸索学习.Net的过程,逐步进行,比较繁琐,是作者本人用来帮助记忆的博文. 我

IEnumerator和IEnumerable接口

枚举器和可枚举类型 前面我们已经知道了使用foreach语句可以遍历数组中的元素.但是为什么那么做呢? 原因是数组按需提供了一个叫做枚举器的对象.枚举器可以依次返回请求数组中的元素. 枚举器知道项的次序并且跟踪它所在序列中的位置,然后返回请求的当前项. 获取一个对象枚举器的方法是调用对象的GetEnumerator方法.实现GetEnumerator方法的类型叫做可枚举类型. 数组是可枚举类型. IEnumerator接口 实现了IEnumerator接口的枚举器包含3个函数成员:Current

C# 索引器,实现IEnumerable接口的GetEnumerator()方法

当自定义类需要实现索引时,可以在类中实现索引器. 用Table作为例子,Table由多个Row组成,Row由多个Cell组成, 我们需要实现自定义的table[0],row[0] 索引器定义格式为 [修饰符] 数据类型 this[索引类型 index] 以下是代码 1 /// <summary> 2 /// 单元格 3 /// </summary> 4 public class Cell 5 { 6 /// <summary> 7 /// Value 8 /// <

IEnumerable接口

IEnumerable接口顾名思义就是 可枚举的,可列举的. 接口也很简单,返回一个 枚举器对象 IEnumerator . 1 [ComVisible(true), Guid("496B0ABE-CDEE-11d3-88E8-00902754C43A")] 2 public interface IEnumerable 3 { 4 [DispId(-4)] 5 IEnumerator GetEnumerator(); 6 } 7 8 9 10 只有一个GetEnumerator方法,返

IEnumerable接口与IEnumerator接口

通过一个例子来看 -------------------------------------------------------Student.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Collections; namespace ConsoleApplication6 {  

foreach为什么要实现IEnumerable接口而不是直接用IEnumerator接口

在.Net中,要想被foreach遍历,那么目标对象要实现IEnumerable或IEnumerable<T>接口,这个接口有一个方法,GetEnumerator(),返回一个IEnumerator接口,这个接口里定义了Next()等方法,例如: public class Garge : IEnumerable { public IEnumerator GetEnumerator { return new A(); } internal class A : IEnumerator { //实现

C# 通过IEnumberable接口和IEnumerator接口实现自定义集合类型foreach功能

1.IEnumerator和IEnumerable的作用 其实IEnumerator和IEnumerable的作用很简单,就是让除数组和集合之外的类型也能支持foreach循环,至于foreach循环,如果不清楚,请参考C# foreach循环较for循环的优势与劣势 代码如下: static void Main(string[] args) { CatList cats = new CatList(); foreach (var cat in cats) { Console.WriteLine