C# Linq 查询执行顺序

标签 c# linq entity-framework-core

考虑以下方法:

public IEnumerable<Owner> GetOwners(OwnerParameters ownerParameters)
{
    return FindAll()
        .OrderBy(on => on.Name)
        .Skip((ownerParameters.PageNumber - 1) * ownerParameters.PageSize)
        .Take(ownerParameters.PageSize)
        .ToList();
}
哪里FindAll()是一个存储库模式方法,返回 IQueryable<Owner> .有没有.OrderBy()之前 .Skip().Take()方法意味着来自 Owner 的所有元素数据表将被检索和排序,或者,Linq 是否考虑到 .Skip().Take()方法可能会缩小所需的范围 Owner元素,只有在检索到这些元素后才会发生排序?
编辑:探查器日志:
SELECT XXX
FROM [Owners] AS [a]
ORDER BY [a].[Name]
OFFSET @__p_0 ROWS FETCH NEXT @__p_1 ROWS ONLY',N'@__p_0 int,@__p_1 int',@__p_0=0,@__p_1=10

最佳答案

最终,这取决于 FindAll() 做什么以及它返回什么:

  • 如果它返回 IEnumerable<T> ,那么它正在使用 LINQ-to-Objects,它基本上只是按照它所说的去做;如果你对页面进行排序,那么它就会对页面进行排序;如果你分页然后排序,那么它分页然后排序
  • 但是,如果它返回 IQueryable<T> ,则查询正在被组合 - 并且仅在 ToList() 中实际执行,此时提供者模型有机会检查您的查询树并构建最合适的实现,这通常意味着:编写一个包含 ORDER BY 和一些适合特定 RDBMS 的分页提示的 SQL 查询;如果您的代码分页然后排序(这是......不寻常)那么我希望大多数提供者要么编写某种可怕的子查询来尝试描述它,要么只是抛出异常(可能是 NotSupportedException )厌恶
  • 关于C# Linq 查询执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68529429/

    相关文章:

    c# - 如何在 C# 中从 IMDB 获取信息

    c# - 如何在CheckedListBox中显示一些记录

    c# - 正则表达式允许 -90.0 和 +90.0 之间的数字

    C# Linq 有四个表和一个并不总是需要的外键

    c# - LINQ 按对象类型选择

    c# - 如何使用 Fluent API 添加等效的所有者属性?

    c# - 将文本与多个正则表达式模式匹配的快速方法

    c# - 如何在 LINQ to SQL/SQLMetal 中有效地更新外键?

    azure - 如何禁用 EF 消息 : Context 'Context' started tracking 'Model' entity. 考虑使用

    c# - 添加迁移 ef core 2 预览 1 时出错