IQueryable<T>和IEnumerable<T>之间的区别是什么?
另见IQueryable和IEnumerable之间的区别是什么,与这个问题重叠。
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 "检查。
我们使用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:当我们想处理进程内内存时,即没有数据连接 可查询:何时处理SQL server,即数据连接 Ilist:添加对象、删除对象等操作
IQueryable比IEnumerable更快,如果我们正在处理来自数据库的大量数据,因为IQueryable只从数据库中获取所需的数据,而IEnumerable无论是否需要从数据库中获取所有数据
以下是我在类似的帖子(关于这个话题)上所写的内容。(不,我通常不引用自己的话,但这些都是非常好的文章。)
这篇文章很有帮助: LINQ-to-SQL中的IQueryable和IEnumerable。
引用那篇文章,“根据MSDN文档,对IQueryable调用通过构建内部表达式树来操作。 这些扩展IQueryable(Of T)的方法不直接执行任何查询。相反,它们的功能是构建Expression对象,该对象是表示累积查询的表达式树。“‘
Expression trees are a very important construct in C# and on the .NET platform. (They are important in general, but C# makes them very useful.) To better understand the difference, I recommend reading about the differences between expressions and statements in the official C# 5.0 specification here. For advanced theoretical concepts that branch into lambda calculus, expressions enable support for methods as first-class objects. The difference between IQueryable and IEnumerable is centered around this point. IQueryable builds expression trees whereas IEnumerable does not, at least not in general terms for those of us who don't work in the secret labs of Microsoft.
下面是另一篇非常有用的文章,从推和拉的角度详细介绍了两者的区别。(通过“push”和“。“拉”,我指的是数据流的方向。用于。net和c#的响应式编程技术
这是一篇非常好的文章,详细介绍了语句lambdas和表达式lambdas之间的区别,并更深入地讨论了表达式树的概念:重访c#委托、表达式树和lambda语句与lambda表达式。”