IEnumerableT和IQueryableT区分
哎,看了那么多,这个知识点还是得开一个文章
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区分相关推荐
- LINQ : IEnumerableT and IQueryableT区别
本地数据源计算机会自动使用IEnumberable<T>,远程数据源会使用IQueryable<T> 下面这条语句没有使用数据库里的EF数据,显示如下: 下面这条语句使用数据库 ...
- Entity Framework中使用IEnumerableT、IQueryableT及IListT的区别
1. IEnumerable<T> IEnumerable<T> :对于在内存中集合上运行的方法,返回的可枚举对象将捕获传递到方法的参数.在枚举该对象时,将使用查询运算符的逻辑 ...
- NET问答:如何理解 IEnumerableT 和 IQueryableT
咨询区 stackoverflowuser: 请问类型 IQueryable<T> 和 IEnumerable<T> 有什么异同?我应该使用哪一个而不是另一个,代码如下: I ...
- Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分)
#Qt pro文件下跨平台宏的使用(windows/linux 以及x86 和 arm的区分) 在pro文件中添加: #仅在linux 系统下, 硬件平台无关的内容 unix{HEADERS += \ ...
- 区分BundleVersion和BundleShortVersionString
区分BundleVersion和BundleShortVersionString 最近遇到了关于检查更新的版本问题了. 问题出在了Info.Plist配置中的两个字段,BundleVersion和Bu ...
- 区分json与jsonp
JSON(JavaScript Object Notation)和JSONP(JSON with Padding)虽然只有一个字母的差别,但其实他们根本不是一回事儿,下边简单区分概括一下: JSON是 ...
- [转]语音识别中区分性训练(Discriminative Training)和最大似然估计(ML)的区别...
转:http://blog.sina.com.cn/s/blog_66f725ba0101bw8i.html 关于语音识别的声学模型训练方法已经是比较成熟的方法,一般企业或者研究机构会采用HTK工具包 ...
- pytorch与keras_Keras vs PyTorch:如何通过迁移学习区分外星人与掠食者
pytorch与keras by Patryk Miziuła 通过PatrykMiziuła Keras vs PyTorch:如何通过迁移学习区分外星人与掠食者 (Keras vs PyTorch ...
- 学术 | 一种新的CNN网络可以更高效地区分自然图像生成图像
作者 | Weize Quan , Kai Wang, Dong-Ming Yan , Xiaopeng Zhang 译者 | linstancy 编辑 | Jane 出品 | AI 科技大本营 [导 ...
最新文章
- windows AD/DNS服务器搭建
- 大朗机器人餐厅在哪里_东莞餐厅惊现机器人服务员 平均每个10万元
- VS2013无法启动 IIS Express Web解决办法
- invalid character found in the request target 异常
- redis基本数据类型之String
- hadoop主节点切换_hadoop2.0 HA的主备自动切换
- 路由添加失败 参数错误_路由器故障排错三大经典案例详解
- java redis事务_Redis事务
- 软件设计师 下午题第4题
- coreseek mysql.sock_coreseek+lnmp实现站内全文检索
- 2014Esri全球用户大会之ArcGIS Online
- 步进驱动系统:步进电机与步进驱动器控制原理简述
- 线性代数矩阵行列式_矩阵的行列式 使用Python的线性代数
- APP行业基准营销数据怎么获取?快用这两个免费应用数据工具
- 使用thop库对yolo等深度学习模型的FLOPS进行计算
- 超级简单thinkphp微信小程序服务商分账。以及小程序普通支付,微信特约商户
- java游戏宠物进化,[娱乐][SCT]imiPet —— 动态动作模型的宠物开源,由社区维护[1.9-1.16]...
- kafka计算机专业读法_计算机专业有哪些行之有效的学习方法?
- 《我想进大厂》之Dubbo普普通通9问
- 全球与中国2,5-二甲基吡啶试剂市场现状及未来发展趋势
热门文章
- php存密码,php 登录验证的代码(基于文件保存的密码)
- 283. Move Zeroes(数组篇)
- 办公室自动化系统_RPA:办公自动化的下一站
- 数学--数论--HDU 2197 本原串 (推规律)
- java web 邮箱激活 与 忘记密码(重置密码)
- 使用jquery插件报错:TypeError:$.browser is undefined的解决方法
- 钽电容极性 钽电容极性判断图解
- 删掉被2345篡改的IE起始页
- 记录: 开发中的2个线程的使用问题
- 如何在不亏本的情况下构建道德数据科学系统?