IQueryable和IEnumerable之间有什么区别?
IQueryable和IEnumerable之间有什么区别?
什么是IQueryable
与IEnumerable
之间的区别?
另请参阅什么是IQueryable和IEnumerable之间的区别与这个问题重叠。
这是一个很不错的 YouTube 视频,展示了这些不同接口的区别,值得一看。
下面是对此的一个描述性答案。
首要要记住的一点是,IQueryable
接口继承自 IEnumerable
接口,因此无论 IEnumerable
能做什么,IQueryable
也能做。
有很多差异,但我们讨论一个最大的差异,这是最重要的。当使用 LINQ
或 Entity framework 加载集合并希望对集合应用筛选器时,IEnumerable
接口很有用。
考虑下面的简单代码,它使用带有 Entity framework 的 IEnumerable
。它使用 Where
过滤器获取 EmpId
为 2
的记录。
EmpEntities ent = new EmpEntities(); IEnumerableemp = ent.Employees; IEnumerable temp = emp.Where(x => x.Empid == 2).ToList ();
这个筛选器在客户端执行,就是在 IEnumerable
代码执行的地方。换句话说,所有数据都从数据库获取,然后在客户端扫描并获取 EmpId
为 2
的记录。
但现在看下面的代码,我们将 IEnumerable
更改为 IQueryable
。它在服务器端创建 SQL 查询,并仅将必要的数据发送到客户端。
EmpEntities ent = new EmpEntities(); IQueryableemp = ent.Employees; IQueryable temp = emp.Where(x => x.Empid == 2).ToList ();
因此,IQueryable
和IEnumerable
的区别在于筛选逻辑的执行位置。一个在客户端执行,另一个在数据库上执行。
因此,如果您仅使用内存数据集合,则IEnumerable
是一个不错的选择,但如果您想查询连接到数据库的数据集合,则IQueryable
是更好的选择,因为它减少了网络流量并使用了SQL语言的能力。
首先,IQueryable
扩展了 IEnumerable
接口,因此你可以使用 "普通" 的 IEnumerable
所能做的任何事情也可以使用 IQueryable
做。
IEnumerable
只有一个 GetEnumerator()
方法,它返回一个 Enumerator
,你可以调用该枚举器的 MoveNext()
方法以遍历 T 的序列。
IQueryable
比 IEnumerable
多了两个特定的属性——一个指向 查询提供程序(例如,LINQ to SQL 提供程序),另一个指向表示 IQueryable
对象的查询表达式,该表达式被表示为可以由给定的查询提供程序理解的运行时可遍历的抽象语法树(在很大程度上,你不能将 LINQ to SQL 表达式给 LINQ to Entities 提供程序而不引发异常)。
表达式可以只是对象本身的常量表达式,也可以是由一组组合的查询操作符和操作数组成的更复杂的树形结构。查询提供程序的 IQueryProvider.Execute()
或 IQueryProvider.CreateQuery()
方法被调用时,将传递一个表达式,然后返回查询结果或另一个 IQueryable
对象。