可查询和计数

Cap*_*and 2 c# linq iqueryable

我有以下几点:

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();
Run Code Online (Sandbox Code Playgroud)

在第Select()一个对象内部创建一个包含第二个列表的对象。

.Count()被执行时,它执行获取第二的Select?还是知道它既不需要执行也不算聪明Select

Jon*_*nna 5

Count()变成Count()查询引擎知道的最佳实现。

数据库支持的查询引擎,如实体框架或LINQ2SQL通常会使用一些原因COUNT(*)COUNT(DISTINCT some_field)或类似的生产的SQL中使用。

其他linq实现将同样尝试尽可能地聪明。例如,Count如果在实现ICollection或的对象上调用linq-to-objects,则它将调用getter而不是通过整个枚举进行枚举ICollection<T>

给定的查询引擎在处理给定的使用时Count()可能最终不得不循环进行项的枚举,因为它无法找出任何更有效的方法。通常,按照Linq的初始类型来保存内容的次数越多(例如,ToList()除非有必要,否则不要打电话,或者即使AsEnumerable()您可以不这样做也不要打电话),引擎会做得更好,尽管有有时例外。