为什么将 Count 与 IQueryable 一起使用被认为是不可行的
如果我有以下代码:-
IQueryable<People> list = repository.FindAllPeople;
int count = list.Count();
那么计算 IQueryable 对象是否被认为是不可行的,并且最好使用 IEnumerable ? BR
If I have the following code:-
IQueryable<People> list = repository.FindAllPeople;
int count = list.Count();
Then is it considered as unfeasible to count IQueryable objects and it is better to use IEnumerable?
BR
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你被误导了。
IEnumerable
将使用 Linq to 对象,所有方法都在内存中的对象上执行。 -IQueryable
将使用特定提供者提供的 Linq 扩展方法的任何实现。在这种情况下(存储库),我猜测它很可能是一个将 Linq 表达式映射到数据库语句的提供程序。这意味着如果您使用
IQueryable
:计数由数据库本身确定,即作为查询
“select count(*) from People”
。这通常非常非常快。如果使用
IEnumerable
:所有 People 实例都将一一具体化到内存中,同时 Linq to object 会迭代集合以确定计数。这将非常缓慢,应尽可能避免。
由于并非所有方法调用都可以映射到数据库查询,因此有时不可避免地要使用
IEnumerable
,但如果可能的话,所有过滤、联接和分组都应在 IQueryable 上完成,然后作为最后一步,您可以使用AsEnumerable()
扩展方法切换为使用IEnumerable
和 Linq to 对象。You have been misinformed.
IEnumerable
will use Linq to objects, all methods are executed on objects in memory. -IQueryable
will use whatever implementation of the Linq extension methods is provided by the specific provider. In this case (a repository) I would guess it is most likely a provider that maps the Linq expressions to database statements.That means if you use
IQueryable
:The count is determined on the database itself, i.e. as a query
"select count(*) from People"
. This is usually very, very fast.If you use
IEnumerable
:All People instances will be materialized to memory one by one while Linq to objects is iterating through the collection to determine the count. This will be very slow and should be avoided whenever possible.
Since not all method calls can be mapped to database queries it is sometimes unavoidable to use an
IEnumerable
, but all filtering, joining and grouping should be done on an IQueryable if possible, then as a last step you can use theAsEnumerable()
extension methods to switch to usingIEnumerable
and Linq to objects.我不熟悉 IQueryable 的不可行性,但是 这篇博文 似乎表明 IQueryable 是比 IEnumerable 更可取,因为 IQueryable 允许访问底层表达式。
这可能仅与Where 子句相关,而不影响.Count()。
I'm not familiar with the infeasability of IQueryable, but this blog post seems to indicate that IQueryable is much more preferable to IEnumerable because IQueryable allows access to the underlying expression.
This may only be relevant in the case of a Where clause and not impact .Count().