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

joh*_* Gu 10 ienumerable iqueryable asp.net-mvc-3

如果我有以下代码: -

IQueryable<People> list = repository.FindAllPeople;  
int count = list.Count(); 
Run Code Online (Sandbox Code Playgroud)

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

Bro*_*ass 20

你被误导了.

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

这意味着如果您使用IQueryable:

IQueryable<People> list = repository.FindAllPeople;  
int count = list.Count(); 
Run Code Online (Sandbox Code Playgroud)

计数在数据库本身上确定,即作为查询"select count(*) from People".这通常非常非常快.

如果您使用IEnumerable:

IEnumerable<People> list = repository.FindAllPeople;  
int count = list.Count(); 
Run Code Online (Sandbox Code Playgroud)

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

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