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接口可以实现自己的查询提供程序。

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

 namespace Wolfy.LinqDemo
{
class Program
{
static void Main(string[] args)
{
using (UserInfoDataContext context = new UserInfoDataContext())
{ //查询的结果放入IQueryable接口的集合中
IQueryable<TB_UserInfo> userInfoQuery= (from u in context.TB_UserInfos
orderby u.ID
select u).Skip<TB_UserInfo>().Take<TB_UserInfo>();
//注意这个AsEnumerable<T_Class>()在分页查询之前,先将其转换成IEnumerable类型
IEnumerable<TB_UserInfo> userInfoEnum = (from u in context.TB_UserInfos
orderby u.ID
select u).AsEnumerable<TB_UserInfo>().Skip<TB_UserInfo>().Take<TB_UserInfo>();
//执行查询
int i = ;
foreach (var item in userInfoQuery)
{
i++;
}
foreach (var item in userInfoEnum)
{
i++;
}
Console.WriteLine("OK");
Console.Read();
}
}
}
}

直接返回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

Linq之IQueryable接口与IEnumberable区别的更多相关文章

  1. IQueryable接口与IEnumberable 区别

    总结一下: IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T> 是将Skip ,t ...

  2. IQueryable接口与IEnumberable区别

    IEnumerable<T> 泛型类在调用自己的SKip 和 Take 等扩展方法之前数据就已经加载在本地内存里了,而IQueryable<T> 是将Skip ,take 这些 ...

  3. IQueryable & IEnumberable 区别

    Namespace And Inheritances Relations ? 1 2 3 4 5 6 7 8 9 Namespace: System.Collections     [ComVisib ...

  4. linq中AsEnumerable和AsQueryable的区别

    本文导读:用Linq来操作集合的时候会用到AsQueryable()和AsEnumerable(),何时该用AsQueryable()和何时该用AsEnumerable(),或许存在些疑惑.AsQue ...

  5. IQueryable与IQEnumberable的区别

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

  6. Entity Framework中IQueryable, IEnumerable, IList的区别[转]

    使用工具追踪EF生成的SQL 使用Entity Framework等ORM框架的时候,SQL对于使用者来说是透明的,往往很多人也不关心ORM所生成的SQL,然而系统出现性能问题的时候就必须关注生成的S ...

  7. LINQ中AsEnumerable与AsQueryable的区别

    AsEnumerable将一个序列向上转换为一个IEnumerable, 强制将Enumerable类下面的查询操作符绑定到后续的子查询当中:AsQueryable将一个序列向下转换为一个IQuery ...

  8. 简述Linq中.ToList(), .AsEnumerable(), AsQueryable()的区别和用法

    [TOC] 这3个方法的功能完全不同, 应按照具体业务场景使用. AsQueryable() 先说说什么是 IQueryable IQueryable 是当前的 data provider 返回的类型 ...

  9. C#编程之IList<T>、List<T>、ArrayList、IList, ICollection、IEnumerable、IEnumerator、IQueryable 和 IEnumerable的区别

    额...今天看了半天Ilist<T>和List<T>的区别,然后惊奇的发现使用IList<T>还是List<T>对我的项目来说没有区别...  在C#中 ...

随机推荐

  1. nopcommerce之权限模块

    这篇文章简单介绍一下nopcommerce的权限模块,nopcommerce里面的权限设计相对比较简单,主要针对后台的action和前台的是否显示(比如产品.品牌等),虽然简单但是应付一般的项目应该没 ...

  2. NOIP2010普及组 三国游戏 -SilverN

    #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> usin ...

  3. 数论+spfa算法 bzoj 2118 墨墨的等式

    2118: 墨墨的等式 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1283  Solved: 496 Description 墨墨突然对等式很感兴 ...

  4. jquery实现整屏翻屏效果:jquery.mousewheel(一)

    实现整屏上下翻效果:需加载的js <script type="text/javascript" src="js/jquery-1.8.3.min.js"& ...

  5. java 16 - 5 LinkedList模拟栈数据结构的集合

    请用LinkedList模拟栈数据结构的集合,并测试 题目的意思是: 你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟. package cn_LinkedList; impo ...

  6. esc安装数据库 sqlserver mssql

    在服务器里面设置虚拟内存为:2G以上就可以安装了

  7. msg url

  8. CardboardCamera Prefab 中文笔记

    在Cardboard的预制体(Prefab)中, CardboardCamera是最简单的一个,仅有两个子物体,一个PostRender, 一个PreRender,以及分别带的Camera组件. Ca ...

  9. C语言 二级指针内存模型①

    //二级指针第一种内存模型 #include<stdio.h> #include<stdlib.h> //说明:①:类似于int a[5]={0},数组名a是一维数组a中首元素 ...

  10. C#属性: 利用set实现递归

    直接帖代码: public class Bird { int xdata; /// <summary> /// 属性的简洁写法,等同于下面的xData方式 /// </summary ...