我有以下内容:
IQueryable<ViewAccountEntry> viewAccountEntries = db.AccountEntries
.Where(x => x.DEntryID == 0)
.Select(x => new ViewAccountEntry()
{
AccountEntry = x,
DAccountEntries = db.AccountEntries
.Where(y => y.DEntryID == 0
&& y.Amount == -x.Amount
&& y.DateEntry == x.DateEntry)
.ToList()
});
Pages = new PageInfo(viewAccountEntries.Count(), page);
ViewAccountEntries = viewAccountEntries
.OrderBy(x => x.AccountEntry.DateEntry)
.Skip(Pages.ItemsSkipped)
.Take(Pages.ItemsPerPage)
.ToList();
在第一个 Select()
中创建了一个包含第二个列表的对象。
当 .Count()
执行时,是否执行第二个 Select
的 fetch?或者它是否智能地计数,知道它不需要执行任何一个 Select
?
最佳答案
Count()
变成了 Count()
的最佳实现查询引擎知道的。
Entity Framework 或 Linq2SQL 等数据库支持的查询引擎通常会使用导致 COUNT(*)
的东西, COUNT(DISTINCT some_field)
或在生成的 SQL 中使用的类似内容。
其他 linq 实现同样会尽可能聪明。例如,linq-to-objects 将调用 Count
如果在实现 ICollection
的对象上调用 getter 而不是枚举整个枚举或 ICollection<T>
.
有可能给定的查询引擎在处理给定的使用时使用Count()
最终将不得不循环遍历项目枚举,因为它无法找到更有效的方法。通常,你越是保持 Linq 的初始类型(例如,除非你需要,否则不要调用 ToList()
,或者如果你可以不这样做的话,甚至不要调用 AsEnumerable()
),引擎就越好可以,尽管有时会有异常(exception)。
关于c# - IQueryable 和计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29416754/