IQueryable和IEnumerable之间有什么区别?

17 浏览
0 Comments

IQueryable和IEnumerable之间有什么区别?

什么是IQueryableIEnumerable之间的区别?


另请参阅什么是IQueryable和IEnumerable之间的区别与这个问题重叠。

admin 更改状态以发布 2023年5月21日
0
0 Comments

这是一个很不错的 YouTube 视频,展示了这些不同接口的区别,值得一看。

下面是对此的一个描述性答案。

首要要记住的一点是,IQueryable 接口继承自 IEnumerable 接口,因此无论 IEnumerable 能做什么,IQueryable 也能做。

enter image description here

有很多差异,但我们讨论一个最大的差异,这是最重要的。当使用 LINQ 或 Entity framework 加载集合并希望对集合应用筛选器时,IEnumerable 接口很有用。

考虑下面的简单代码,它使用带有 Entity framework 的 IEnumerable。它使用 Where 过滤器获取 EmpId2 的记录。

EmpEntities ent = new EmpEntities();
IEnumerable emp = ent.Employees; 
IEnumerable temp = emp.Where(x => x.Empid == 2).ToList();

这个筛选器在客户端执行,就是在 IEnumerable 代码执行的地方。换句话说,所有数据都从数据库获取,然后在客户端扫描并获取 EmpId2 的记录。

enter image description here

但现在看下面的代码,我们将 IEnumerable 更改为 IQueryable。它在服务器端创建 SQL 查询,并仅将必要的数据发送到客户端。

EmpEntities ent = new EmpEntities();
IQueryable emp = ent.Employees;
IQueryable temp =  emp.Where(x => x.Empid == 2).ToList();

enter image description here

因此,IQueryableIEnumerable的区别在于筛选逻辑的执行位置。一个在客户端执行,另一个在数据库上执行。

因此,如果您仅使用内存数据集合,则IEnumerable是一个不错的选择,但如果您想查询连接到数据库的数据集合,则IQueryable是更好的选择,因为它减少了网络流量并使用了SQL语言的能力。

0
0 Comments

首先,IQueryable 扩展了 IEnumerable 接口,因此你可以使用 "普通" 的 IEnumerable 所能做的任何事情也可以使用 IQueryable 做。

IEnumerable 只有一个 GetEnumerator() 方法,它返回一个 Enumerator,你可以调用该枚举器的 MoveNext() 方法以遍历 T 的序列。

IQueryableIEnumerable 多了两个特定的属性——一个指向 查询提供程序(例如,LINQ to SQL 提供程序),另一个指向表示 IQueryable 对象的查询表达式,该表达式被表示为可以由给定的查询提供程序理解的运行时可遍历的抽象语法树(在很大程度上,你不能将 LINQ to SQL 表达式给 LINQ to Entities 提供程序而不引发异常)。

表达式可以只是对象本身的常量表达式,也可以是由一组组合的查询操作符和操作数组成的更复杂的树形结构。查询提供程序的 IQueryProvider.Execute()IQueryProvider.CreateQuery() 方法被调用时,将传递一个表达式,然后返回查询结果或另一个 IQueryable 对象。

0