IQueryable<T>
和IEnumerable<T>
什么区别? html
另请参见与该问题重叠的IQueryable和IEnumerable之间有什么区别 。 数据库
IEnumerable: IEnumerable最适合用于内存中的收集(或本地查询)。 IEnumerable不会在项目之间移动,它是仅转发集合。 编程
IQueryable: IQueryable最适合于远程数据源,例如数据库或Web服务(或远程查询)。 IQueryable是一项很是强大的功能,可启用各类有趣的延迟执行方案(例如基于分页和基于组合的查询)。 服务器
所以,当您只须要简单地遍历内存中的集合时,请使用IEnumerable,若是您须要对集合进行任何操做(如数据集和其余数据源),请使用IQueryable 网络
IEnumerable引用了一个集合,可是IQueryable只是一个查询,它将在Expression Tree内生成。咱们将运行此查询从数据库中获取数据。 框架
简而言之,另外一个主要区别是IEnumerable在服务器端执行select查询,在客户端加载内存中的数据,而后过滤数据,而IQueryable在服务器端使用全部过滤器执行select查询。 spa
这是我在相似帖子(关于此主题)上写的内容。 (不,我一般不引述本身,但这是很是好的文章。) code
“这篇文章颇有帮助: LINQ-to-SQL中的IQueryable与IEnumerable 。 视频
引用该文章,“根据MSDN文档,对IQueryable的调用是经过构建内部表达式树来进行的。 “这些扩展IQueryable(Of T)的方法不会直接执行任何查询。相反,它们的功能是构建一个Expression对象,该对象是表示累积查询的表达式树。” htm
表达式树是C#和.NET平台上很是重要的构造。 (它们一般很重要,可是C#使它们很是有用。)为了更好地理解它们之间的区别,建议您在此处阅读正式C#5.0规范中 表达式和语句之间的区别。 对于分支到lambda演算的高级理论概念,表达式使对方法的支持成为一流的对象。 IQueryable和IEnumerable之间的差别围绕这一点。 IQueryable能够构建表达式树,而IEnumerable则不能,至少对于那些不在Microsoft秘密实验室工做的人而言,至少不是通常而言。
这是另外一篇很是有用的文章,从推与拉角度详细介绍了差别。 (经过“推”与“拉”,我指的是数据流的方向。.NET和C#的响应式编程技术
这是一篇很是不错的文章,详细介绍了语句lambda和表达式lambda之间的区别,并更深刻地讨论了表达式tress的概念: 复习C#委托,表达式树和lambda语句与lambda表达式。 ”。
这是youtube上的精彩视频 ,展现了这些界面的不一样之处,值得一看。
下面为它提供了一个长的描述性答案。
要记住的第一个重要点是IQueryable
接口继承自IEnumerable
,所以,不管IEnumerable
能够作什么, IQueryable
均可以作到。
差别不少,但让咱们讨论一个最大的差别。 当使用LINQ
或Entity框架加载您的集合而且您要在集合上应用过滤器时, IEnumerable
接口很是有用。
考虑下面的简单代码,它将IEnumerable
与实体框架一块儿使用。 它使用Where
过滤器来获取EmpId
为2
记录。
EmpEntities ent = new EmpEntities(); IEnumerable<Employee> emp = ent.Employees; IEnumerable<Employee> temp = emp.Where(x => x.Empid == 2).ToList<Employee>();
在IEnumerable
代码所在的客户端上执行过滤器的位置。 换句话说,全部数据都是从数据库中获取的,而后在客户端进行扫描并得到EmpId
为2
的记录。
可是如今看下面的代码,咱们将IEnumerable
更改成IQueryable
。 它在服务器端建立一个SQL查询,而且仅将必要的数据发送到客户端。
EmpEntities ent = new EmpEntities(); IQueryable<Employee> emp = ent.Employees; IQueryable<Employee> temp = emp.Where(x => x.Empid == 2).ToList<Employee>();
所以, IQueryable
和IEnumerable
之间的区别在于执行过滤器逻辑的位置。 一个在客户端执行,另外一个在数据库上执行。
所以,若是仅使用内存数据收集,则IEnumerable
是一个不错的选择,可是若是要查询与数据库链接的数据收集,则IQueryable是一个更好的选择,由于它减小了网络流量并使用了SQL语言的强大功能。