IQueryable和IEnumerable以及AsEnumerable()和ToList()的区别
注意:本文背景为 Linq to sql 。文中ie指代IEnumerable,iq指代IQueryable。
IQueryable 和 IEnumerable 的区别
IQueryable
延时执行;扩展方法接受的是Expression(必须要能转成sql,否则报错)IEnumerable
延时执行;扩展方法接受的是Func(C#语法)
AsEnumerable() 和 ToList() 的区别
ToList()
立即执行,加载数据到内存中。AsEnumerable()
延时执行,真正使用时才加载数据。
对IQueryable对象使用AsEnumerable()后,仍然是延时执行,不过此时对象本质已经变了。
前面已经说了IEnumerable的扩展方法接受的是Func(C#语法),当ie对象(iq转变)真正使用时,会有2个步骤:
- 它会把iq对象(转变之前的)的扩展方法翻译成sql语句,查询出数据加载到内存中,变为ie对象;
- 此时再把ie对象(转变之后的)的扩展方法,使用C#求解,得到最终结果。
例如:
iq对象的Skip、Take方法,会被翻译成sql,在数据库里执行取出最终结果。
而ie对象的Skip、Take方法,则会取出全部数据到内存中,在内存中执行Skip、Take,会耗费大量资源。
误区
误区1:对 iq对象 和 ie对象 使用foreach时,对于循环的每项都要查询数据库。
错误!
foreach针对的是数据集整体对象(枚举器?)。当使用foreach时,不管是iq对象还是ie对象,它们都是查询数据库一次,然后开始循环,直至循环结束。不过,当后续再次使用iq对象或ie对象的具体数据时,它们仍然会再次查询数据库。
结论
假设我们把最终数据之前的数据称为中间数据,那么:
- 当中间数据只是作为条件筛选,需要的只是层层筛选之后的最终数据时,应该继续使用IQueryable,防止加载不必要的数据到内存中。
- 当存在中间数据,且中间数据被重复使用时,应该使用IQueryable.ToList()立即加载到内存里使用(都被重复使用了,应该叫做最终数据了吧..);
- 如果中间结果无用,且想对IQueryable对象使用Func(C#语法)的扩展方法,应该使用IQueryable.AsEnumerable()转成IEnumerable对象,进行后续操作。
参考
- LINQ查询中的IEnumerable<T>和IQueryable<T>
- LINQ使用细节之.AsEnumerable()和.ToList()的区别
- 建议29:区别LINQ查询中的IEnumerabl<T>和IQueryable<T> - 陆敏技《编写高质量代码改善C#程序的157个建议》
IQueryable和IEnumerable以及AsEnumerable()和ToList()的区别的更多相关文章
- LINQ使用细节之.AsEnumerable()和.ToList()的区别
先看看下面的代码,用了 .AsEnumerable(): 1 var query = (from a in db.Table2 where a = SomeCondition3 select a.So ...
- Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法
Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法:在写LINQ语句的时候,往往会看到AsEnumerable() ,AsQueryable() 和T ...
- MVC+Spring.NET+NHibernate .NET SSH框架整合 C# 委托异步 和 async /await 两种实现的异步 如何消除点击按钮时周围出现的白线? Linq中 AsQueryable(), AsEnumerable()和ToList()的区别和用法
MVC+Spring.NET+NHibernate .NET SSH框架整合 在JAVA中,SSH框架可谓是无人不晓,就和.NET中的MVC框架一样普及.作为一个初学者,可以感受到.NET出了MV ...
- IQueryable和IEnumerable
使用EF你必须知道这两个的区别,可以帮助我们的提升性能. 表达树:Linq 表达 ①IQueryable和IEnumerable IQueryable 延时执行:扩展方法接受的是Expression( ...
- C# IQueryable和IEnumerable的区别
在使用EF查询数据的时候,我们常用的查询数据方式有linq to sql,linq to object, 查询返回的结果有两种类型:IQueryable.IEnumerable,两者内部的处理机制是完 ...
- C#编程之IList<T>、List<T>、ArrayList、IList, ICollection、IEnumerable、IEnumerator、IQueryable 和 IEnumerable的区别
额...今天看了半天Ilist<T>和List<T>的区别,然后惊奇的发现使用IList<T>还是List<T>对我的项目来说没有区别... 在C#中 ...
- IQueryable和IEnumerable,IList的区别
IQueryable和IEnumerable都是延时执行(Deferred Execution)的,而IList是即时执行(Eager Execution) IQueryable和IEnumerabl ...
- IQueryable 和 IEnumerable
IQueryable 和 IEnumerable 其实,对于上面的即有过虑又有排序的条件查询Linq语句,EF是读取数据库中整个Books表中的数据到内存,还是根据Linq查询语句智能的生成SQL再执 ...
- C#中IQueryable和IEnumerable的区别
最近的一个面试中,被问到IQueryable 和 IEnumerable的区别, 我自己看了一些文章,总结如下: 1. 要明白一点,IQueryable接口是继承自IEnumerable的接口的. 2 ...
随机推荐
- 【转载】SQL server connection KeepAlive
1.什么是SQL server TCP连接的keep Alive? 简单说,keep alive 是SQL server在建立每一个TCP 连接的时候,指定了TCP 协议的keepaliveinter ...
- UVA 562 Dividing coins【01背包 / 有一堆各种面值的硬币,将所有硬币分成两堆,使得两堆的总值之差尽可能小】
It's commonly known that the Dutch have invented copper-wire. Two Dutch men were fighting over a nic ...
- poj3693(后缀数组)
poj3693 题意 给出一个串,求重复次数最多的连续重复子串,输出字典序最小的. 分析 论文 例8(P21). Sparse-Table算法预处理出任意两个后缀串的LCP. code #includ ...
- JSK 18: 跳跃游戏
题目描述 给定一个非负整数数组,假定你的初始位置为数组第一个下标. 数组中的每个元素代表你在那个位置能够跳跃的最大长度. 请确认你是否能够跳跃到数组的最后一个下标. 例如:$A = [2,3,1,1, ...
- (转)Unity3D 开发优秀技术资源汇总
原文:http://www.j2megame.com/html/xwzx/ty/3179.html Unity3D 博客 http://www.dapp.com.br/ by Dapp http:/ ...
- 迭代加深搜索[codevs1004 四子连棋]
迭代加深搜索 一.算法简介 迭代加深搜索是在速度上接近广度优先搜索,空间上和深度优先搜索相当的搜索方式.由于在使用过程中引入了深度优先搜索,所以也可以当作深度优先搜索的优化方案. 迭代加深搜索适用于当 ...
- java多线程设计模式(3)读写锁模式
1 Read-Write Lock Pattern Read-Write Lock Pattern是一种将对于共享资源的访问与修改操作分离,称为读写分离.即访问是reader,修改是write,用单独 ...
- openfire源码解读之将cache和session对象移入redis以提升性能
原文:http://blog.csdn.net/jinzhencs/article/details/50522322 前言: 目前我们的openfire服务器只能支撑单机2W 集群4W.(估测在线用户 ...
- [Android Traffic] 根据网络类型更改下载模式
转载自: http://blog.csdn.net/kesenhoo/article/details/7396321 Modifying your Download Patterns Based on ...
- codeigniter与swfupload完整解决方案
转自:http://blog.sina.com.cn/s/blog_6d8dc8eb0100s4bv.html codeigniter(简称ci)有研究了一段时间了,看重的是ci的轻量,便捷,最近公司 ...