ast*_*ter 3 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();
}
Run Code Online (Sandbox Code Playgroud)
哪里FindAll()是一个存储库模式方法的回报IQueryable<Owner>。拥有.OrderBy()before.Skip()和.Take()methods是否意味着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
Run Code Online (Sandbox Code Playgroud)
最终,这取决于做什么FindAll()和返回什么:
IEnumerable<T>,那么它正在使用 LINQ-to-Objects,它基本上只是按照它所说的去做;如果你对页面进行排序,那么它就会对页面进行排序;如果你分页然后排序,那么它会分页然后排序IQueryable<T>,则查询正在组合- 并且仅在 中实际执行ToList(),此时提供程序模型有机会检查您的查询树并构建最合适的实现,这通常意味着:编写一个 SQL 查询包括一个ORDER BY和一些适合特定 RDBMS 的分页提示;如果您的代码分页然后排序(这是......不寻常)那么我希望大多数提供者要么编写某种可怕的子查询来尝试描述它,要么只是NotSupportedException厌恶地抛出异常(可能)| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |