如果我有以下代码:-
IQueryable<People> list = repository.FindAllPeople;
int count = list.Count();
那么是否认为对 IQueryable 对象进行计数是不可行的,而使用 IEnumerable 更好呢?
BR
你被误导了。
IEnumerable
将使用 Linq to 对象,所有方法都在对象上执行在记忆中. - 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();
当 Linq to object 迭代集合以确定计数时,所有 People 实例都将一一具体化到内存中。这将非常缓慢,应尽可能避免。
由于并非所有方法调用都可以映射到数据库查询,因此有时不可避免地要使用IEnumerable
,但如果可能的话,所有过滤、连接和分组都应该在 IQueryable 上完成,然后作为最后一步,您可以使用AsEnumerable()
切换到使用的扩展方法IEnumerable
和 Linq 到对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)