如果我有以下代码: -
IQueryable<People> list = repository.FindAllPeople;
int count = list.Count();
然后认为计算IQueryable对象是不可行的,使用IEnumerable更好吗? BR
答案 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()。