为什么将Count与IQueryable一起使用被认为是不可行的

时间:2012-02-12 02:30:23

标签: asp.net-mvc-3 ienumerable iqueryable

如果我有以下代码: -

IQueryable<People> list = repository.FindAllPeople;  
int count = list.Count(); 

然后认为计算IQueryable对象是不可行的,使用IEnumerable更好吗? BR

2 个答案:

答案 0 :(得分:20)

你被误导了。

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

这意味着如果您使用IQueryable

IQueryable<People> list = repository.FindAllPeople;  
int count = list.Count(); 

计数是根据数据库本身确定的,即作为查询"select count(*) from People"。这通常非常非常快。

如果您使用IEnumerable

IEnumerable<People> list = repository.FindAllPeople;  
int count = list.Count(); 

所有People实例将逐个实现到内存,而Linq to objects正在遍历集合以确定计数。这将非常缓慢,应尽可能避免。

由于并非所有方法调用都可以映射到数据库查询,因此有时使用IEnumerable是不可避免的,但是如果可能的话,所有过滤,连接和分组都应该在IQueryable上完成,然后作为最后一步,你可以使用AsEnumerable()扩展方法切换到使用IEnumerable和Linq到对象。

答案 1 :(得分:0)

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

这可能仅在Where子句的情况下有效,而不影响.Count()。