Asp.net mvc 3 为什么将Count与IQueryable一起使用被认为是不可行的

Asp.net mvc 3 为什么将Count与IQueryable一起使用被认为是不可行的,asp.net-mvc-3,ienumerable,iqueryable,Asp.net Mvc 3,Ienumerable,Iqueryable,如果我有以下代码:- IQueryable<People> list = repository.FindAllPeople; int count = list.Count(); IQueryable list=repository.FindAllPeople; int count=list.count(); 那么,是否认为计算IQueryable对象是不可行的,而使用IEnumerable更好? BR我不熟悉IQueryable的不可感染性,但似乎表明IQueryable比

如果我有以下代码:-

IQueryable<People> list = repository.FindAllPeople;  
int count = list.Count(); 
IQueryable list=repository.FindAllPeople;
int count=list.count();
那么,是否认为计算IQueryable对象是不可行的,而使用IEnumerable更好?
BR

我不熟悉IQueryable的不可感染性,但似乎表明IQueryable比IEnumerable更可取,因为IQueryable允许访问底层表达式


这可能仅在Where子句的情况下相关,而不是impact.Count()。

您收到的信息是错误的

IEnumerable
将使用Linq访问对象,所有方法都在内存中的对象上执行。-
IQueryable
将使用特定提供者提供的Linq扩展方法的任何实现。在本例中(存储库),我猜它很可能是一个将Linq表达式映射到数据库语句的提供者

这意味着如果使用
IQueryable

IQueryable<People> list = repository.FindAllPeople;  
int count = list.Count(); 
IEnumerable<People> list = repository.FindAllPeople;  
int count = list.Count(); 
当Linq to对象在集合中迭代以确定计数时,所有人员实例将逐个物化到内存中。这将非常缓慢,应尽可能避免


由于并非所有方法调用都可以映射到数据库查询,因此有时不可避免地使用
IEnumerable
,但所有筛选、连接和分组都应尽可能在IQueryable上完成,然后作为最后一步,您可以使用
AsEnumerable()
切换到使用
IEnumerable
和Linq to objects的扩展方法。

在我的情况下,对excel文档运行count对性能不是很好。300-400ms,约350行。谢谢你的解释。帮助我理解为什么它这么慢。