【问题标题】:How does entity framework count total rows in one query?实体框架如何计算一个查询中的总行数?
【发布时间】:2015-07-03 00:41:00
【问题描述】:

我正在使用 Dapper 将一些实体框架查询换成手工制作的 SQL。到目前为止一切都很顺利——我唯一苦苦挣扎的是在单个数据库查询中实现高效的分页。

我们现在的代码是这样的:

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() 表达式,也没有发出两个查询。我真的很困惑 - 它是如何计算子查询中的行数的?

【问题讨论】:

    标签: sql pagination entity-framework-6


    【解决方案1】:

    您的PagedList 方法实际上是在进行两次数据库调用。

    1. int total = source.Count();
    2. source.Skip(pageIndex * pageSize).Take(pageSize).ToList()

    您发布的查询来自2

    【讨论】:

    • 但是为什么 Glimpse 会显示 EF 生成的所有其他数据库查询,而不是 COUNT 一个?
    猜你喜欢
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多