IEnumerable 与 IQueryable






4.82/5 (99投票s)
IEnumerable 与 IQueryable
许多开发者容易混淆 IEnumerable
和 IQueryable
。在编写代码时,它们看起来非常相似。然而,它们之间存在许多差异,在编写代码时需要注意。两者都有一些预期的使用场景,为此它们才被创建。
以下是基于其属性的它们之间的差异
IEnumerable | IQueryable | |
命名空间 | System.Collections 命名空间 | System.Linq 命名空间 |
继承自 | 没有基础接口 | 继承自 IEnumerable |
延迟执行 | 支持 | 支持 |
懒加载 | 不支持 | 支持 |
它是如何工作的 | 在从数据库查询数据时,IEnumerable 在服务器端执行 select 查询,将数据加载到客户端内存中,然后过滤数据。因此,它执行更多的工作,速度较慢。 | 在从数据库查询数据时,IQueryable 在服务器端执行 select 查询,并应用所有过滤器。因此,它执行更少的工作,速度更快。 |
适用场景 | LINQ to Object 和 LINQ to XML 查询 | LINQ to SQL 查询 |
自定义查询 | 不支持 | 支持使用 CreateQuery 和 Execute 方法 |
扩展方法 参数 | IEnumerable 中支持的扩展方法接收函数对象。 | IQueryable 中支持的扩展方法接收表达式对象,即表达式树。 |
何时使用 | 在查询来自内存集合(如 List 、Array 等)的数据时。 | 在查询来自内存之外的数据(如远程数据库、服务)集合时。 |
最佳用途 | 内存遍历 | 分页 |