哎,看了那么多,这个知识点还是得开一个文章

IQueryable和IEnumerable都是延时执行(Deferred Execution)的,而IList是即时执行(Eager Execution)

IQueryable和IEnumerable在每次执行时都必须连接数据库读取,而IList读取一次后,以后各次都不需连接数据库。

前两者很容易造成重复读取,性能低下,并且可能引发数据不一致性

IQueryable弊端:当把查询出来的数据,根据指定条件添加到其他表中时,会报连接以打开错误!原因:IQueryable在每次执行时都必须连接数据库读取,所以数据库连接是一直开着的!

LINQ查询方法一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:

    Enumerable类,它针对继承了IEnumerable<T>接口的集合类进行扩展。

    Queryable类,它针对继承了IQueryable<T>接口的集合类进行扩展。

接口IQueryable<T>实际也是继承了IEnumerable<T>接口的,简单的来表述就是:本地数据源用IEnumerable<T>,远程数据源用IQueryable<T>。

LINQ查询从功能上来讲实际上可以分为三类:LINQ to OBJECTS、LINQ to  SQL、LINQ to XML。设计Enumerable<T>和Queryable<T>两套接口的原因是为了区别对待LINQ to OBJECTS、LINQ to SQL,

针对LINQ to OBJECTS时,使用Enumerable中的扩展方法对本地集合进行排序和查询等操作,查询参数接受的是Func<>。

针对LINQ to SQL时,则使用Queryable中的扩展方法,它接受的参数是Expression<>。

LINQ to SQL引擎最终会将表达式树转化成为相应的SQL语句,然后在数据库中执行。//表达式树???啥jb

原文在使用EF查询数据的时候,我们常用的查询数据方式有linq to sql,linq to object,
查询返回的结果有两种类型:IQueryable、IEnumerable,两者内部的处理机制是完全不同的。在System.linq命名空间,有两个静态类:Queryable和Enumerable.

在System.linq.Queryable中,参数接收的是一个表达式类型,返回IQueryable接口public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate);在System.linq.Enumerable中,参数接收的是一个谓词表达式,也就是一个委托public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);  
那么在查询数据使用linq to object的时候,会根据传递的参数不同返回不同的类型. 1.where条件接收表达式,返回IQueryable接口

2.where条件接收一个谓词表达式(委托)返回一个IEnumerable接口

那么什么时候用IQueryable<T>,什么时候用IEnumerable<T>?

1.Expression是一个表达式,会存储拼接表达式树,直到在运行期最终执行。

2.Func<>谓词表达式,就是一个委托,委托一旦调用,就立即执行了,将执行结果保存在内存中。

那么在EF中我们根据条件查询数据时,不应该把数据一次性加载到本地内存中,然后再本地内存中进行筛选,如果数据量大了,就崩溃了。

我们需要将表达式组合好,然后再一起提交到数据库执行,返回查询结果。(那这句话的意思是在ef查询中用Iqueryable接收)

每次在执行where查询操作符的时候IQueryProvider会为我们创建一个新的IQueryable<T>,调用AsEnumerable()方法的时候并不会去实际取值,只是

得到了一个IEnumerable,所以EF在查询数据时候不要先取IEnumerable再去筛选数据。执行ToList方法时才会去真正调用迭代器GetEnumerator()
取值。真正取值时候,会去执行IQueryProvider中的Excute方法.(解析表达式,然后执行取得结果))

这就是IQueryable的延迟加载把.

原文

  

转载于:https://www.cnblogs.com/ZkbFighting/p/9142646.html

IEnumerableT和IQueryableT区分相关推荐

  1. LINQ : IEnumerableT and IQueryableT区别

    本地数据源计算机会自动使用IEnumberable<T>,远程数据源会使用IQueryable<T> 下面这条语句没有使用数据库里的EF数据,显示如下: 下面这条语句使用数据库 ...

  2. Entity Framework中使用IEnumerableT、IQueryableT及IListT的区别

    1. IEnumerable<T> IEnumerable<T> :对于在内存中集合上运行的方法,返回的可枚举对象将捕获传递到方法的参数.在枚举该对象时,将使用查询运算符的逻辑 ...

  3. NET问答:如何理解 IEnumerableT 和 IQueryableT

    咨询区 stackoverflowuser: 请问类型 IQueryable<T> 和 IEnumerable<T>  有什么异同?我应该使用哪一个而不是另一个,代码如下: I ...

  4. Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分)

    #Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分) 在pro文件中添加: #仅在linux 系统下, 硬件平台无关的内容 unix{HEADERS += \ ...

  5. 区分BundleVersion和BundleShortVersionString

    区分BundleVersion和BundleShortVersionString 最近遇到了关于检查更新的版本问题了. 问题出在了Info.Plist配置中的两个字段,BundleVersion和Bu ...

  6. 区分json与jsonp

    JSON(JavaScript Object Notation)和JSONP(JSON with Padding)虽然只有一个字母的差别,但其实他们根本不是一回事儿,下边简单区分概括一下: JSON是 ...

  7. [转]语音识别中区分性训练(Discriminative Training)和最大似然估计(ML)的区别...

    转:http://blog.sina.com.cn/s/blog_66f725ba0101bw8i.html 关于语音识别的声学模型训练方法已经是比较成熟的方法,一般企业或者研究机构会采用HTK工具包 ...

  8. pytorch与keras_Keras vs PyTorch:如何通过迁移学习区分外星人与掠食者

    pytorch与keras by Patryk Miziuła 通过PatrykMiziuła Keras vs PyTorch:如何通过迁移学习区分外星人与掠食者 (Keras vs PyTorch ...

  9. 学术 | 一种新的CNN网络可以更高效地区分自然图像生成图像

    作者 | Weize Quan , Kai Wang, Dong-Ming Yan , Xiaopeng Zhang 译者 | linstancy 编辑 | Jane 出品 | AI 科技大本营 [导 ...

最新文章

  1. windows AD/DNS服务器搭建
  2. 大朗机器人餐厅在哪里_东莞餐厅惊现机器人服务员 平均每个10万元
  3. VS2013无法启动 IIS Express Web解决办法
  4. invalid character found in the request target 异常
  5. redis基本数据类型之String
  6. hadoop主节点切换_hadoop2.0 HA的主备自动切换
  7. 路由添加失败 参数错误_路由器故障排错三大经典案例详解
  8. java redis事务_Redis事务
  9. 软件设计师 下午题第4题
  10. coreseek mysql.sock_coreseek+lnmp实现站内全文检索
  11. 2014Esri全球用户大会之ArcGIS Online
  12. 步进驱动系统:步进电机与步进驱动器控制原理简述
  13. 线性代数矩阵行列式_矩阵的行列式 使用Python的线性代数
  14. APP行业基准营销数据怎么获取?快用这两个免费应用数据工具
  15. 使用thop库对yolo等深度学习模型的FLOPS进行计算
  16. 超级简单thinkphp微信小程序服务商分账。以及小程序普通支付,微信特约商户
  17. java游戏宠物进化,[娱乐][SCT]imiPet —— 动态动作模型的宠物开源,由社区维护[1.9-1.16]...
  18. kafka计算机专业读法_计算机专业有哪些行之有效的学习方法?
  19. 《我想进大厂》之Dubbo普普通通9问
  20. 全球与中国2,5-二甲基吡啶试剂市场现状及未来发展趋势

热门文章

  1. php存密码,php 登录验证的代码(基于文件保存的密码)
  2. 283. Move Zeroes(数组篇)
  3. 办公室自动化系统_RPA:办公自动化的下一站
  4. 数学--数论--HDU 2197 本原串 (推规律)
  5. java web 邮箱激活 与 忘记密码(重置密码)
  6. 使用jquery插件报错:TypeError:$.browser is undefined的解决方法
  7. 钽电容极性 钽电容极性判断图解
  8. 删掉被2345篡改的IE起始页
  9. 记录: 开发中的2个线程的使用问题
  10. 如何在不亏本的情况下构建道德数据科学系统?