IQueryable<T>和IEnumerable<T>之间的区别是什么?


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


当前回答

IQueryable比IEnumerable更快,如果我们正在处理来自数据库的大量数据,因为IQueryable只从数据库中获取所需的数据,而IEnumerable无论是否需要从数据库中获取所有数据

其他回答

在现实生活中,如果您正在使用LINQ-to-SQL之类的ORM

如果您创建了IQueryable查询,那么该查询可能会转换为sql并在数据库服务器上运行 如果您创建了一个IEnumerable,那么在运行查询之前,所有行都将作为对象拉入内存。

在这两种情况下,如果你不调用ToList()或ToArray(),那么查询将在每次使用它时执行,所以,比如说,你有一个IQueryable<T>,你从它填充4个列表框,那么查询将对数据库运行4次。

同样,如果你扩展你的查询:

q.Where(x.name = "a").ToList()

然后使用IQueryable生成的SQL将包含" where name = " a ",但是使用IEnumerable会从数据库中拉回更多的角色,然后. net将完成x.name = " a "检查。

这是youtube上的一个很好的视频,它演示了这些界面的区别,值得一看。

下面是一个很长的描述性答案。

首先要记住的是IQueryable接口继承自IEnumerable,所以无论IEnumerable能做什么,IQueryable也能做什么。

有很多不同之处,但让我们来讨论一个最大的不同,它造成了最大的不同。IEnumerable接口是有用的,当你的集合是使用LINQ或实体框架加载,你想对集合应用过滤器。

考虑下面使用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语言的力量。

我们使用IEnumerable和IQueryable来操作从数据库中检索的数据。IQueryable继承自IEnumerable,所以IQueryable包含了IEnumerable的所有特性。IQueryable和IEnumerable之间的主要区别是IQueryable使用过滤器执行查询,而IEnumerable先执行查询,然后根据条件过滤数据。

更详细的区别如下:

IEnumerable

IEnumerable在系统中存在。集合名称空间 IEnumerable在服务器端执行选择查询,在客户端加载内存中的数据,然后筛选数据 IEnumerable适用于从List、Array等内存集合中查询数据 IEnumerable有利于LINQ to Object和LINQ to XML查询

这个IQueryable

系统中存在IQueryable功能。Linq命名空间 IQueryable在服务器端执行一个带有所有过滤器的“选择查询” IQueryable适用于从内存外(如远程数据库,服务)集合中查询数据 IQueryable有利于LINQ到SQL的查询

所以IEnumerable通常用于处理内存中的集合,而IQueryable通常用于操作集合。

IEnumerable引用了一个集合,而IQueryable只是一个查询,它将在表达式树中生成。我们将运行这个查询从数据库中获取数据。

IQueryable比IEnumerable更快,如果我们正在处理来自数据库的大量数据,因为IQueryable只从数据库中获取所需的数据,而IEnumerable无论是否需要从数据库中获取所有数据