我正在使用Dapper交换手工SQL的一些Entity Framework查询。到目前为止,一切进展顺利 - 我唯一挣扎的就是在单个数据库查询中实现高效的分页。
我们目前的代码是这样的:
public PagedList(IQueryable<T> source, int pageIndex, int pageSize)
{
int total = source.Count();
TotalCount = total;
TotalPages = total / pageSize;
if (total % pageSize > 0)
TotalPages++;
PageSize = pageSize;
PageIndex = pageIndex;
AddRange(source.Skip(pageIndex * pageSize).Take(pageSize).ToList());
}
如果我对此进行调试,我可以看到从Source.Count()返回的总行数。
但是,当我使用Glimpse检查生成的SQL时,我只能看到一个查询到数据库。类似的东西:
SELECT TOP 30 field1, field2
FROM (
SELECT field1, field2, row_number()
OVER (ORDER BY [Project1].[Score] DESC) AS [row_number] WHERE ..) AS Project1
WHERE project1.row_number > 30
我在这里看不到任何COUNT()
个表达式,也没有发出两个查询。我真的很困惑 - 它如何计算子查询中的行数?
答案 0 :(得分:1)
您的PagedList
方法实际上正在进行两次数据库调用。
int total = source.Count();
source.Skip(pageIndex * pageSize).Take(pageSize).ToList()
您发布的查询来自2