c# - IQueryable 和计数

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

在第一个 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/

相关文章:

c# - 如何使用 LINQ 选择具有最小或最大属性值的对象

asp.net - 具有 .Any 条件的 Linq 查询返回 nullreference 异常

c# - 将空子对象从父对象传递到局部 View

c# - 在 ASP.Net 中定义自己的 TlsCipherSuite

c# - 从指定列和行中的数据网格收集数据

sql - 比较日期然后插入数据

C# LINQ xml解析使用 "PreviousNode"

c# - SingleResult.Create 在空 IQueryable 上的 Odata 序列化错误

c# - 从 dict.AsQueryable() 获取原始字典

c# - ITestActionResult.ErrorMessage 中的回车