gpt4 book ai didi

C# Linq 查询执行顺序

转载 作者:行者123 更新时间:2023-12-04 12:31:52 25 4
gpt4 key购买 nike

考虑以下方法:

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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com