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

发布于 2025-01-04 21:45:31 字数 191 浏览 1 评论 0原文

如果我有以下代码:-

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

时光是把杀猪刀 2025-01-11 21:45:31

你被误导了。

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(); 

所有 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:

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

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:

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

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 the AsEnumerable() extension methods to switch to using IEnumerable and Linq to objects.

葬﹪忆之殇 2025-01-11 21:45:31

我不熟悉 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().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文