Linq to SQL("从表中选择 *")。计数() vs ( "select column from table" )。计数()



我在写一些linq查询时遇到了以下场景:

我想使用基于某种过滤器的Linq从DB中获取记录

在这里,我想把所有的记录计数也,所以我喜欢下面的

    var queryData = pageContext.ExecuteQuery<MYVIEW>("select * from MYVIEW where {condition} "+ (!String.IsNullOrEmpty(query) ? " and " + query : "") + (!String.IsNullOrEmpty(sortString) ? "order by  " + sortString : ""));
            recordCount = queryData.Count();
            result = queryData.Skip(skip)
                    .Take((resultsPerPage).AsQueryable()
                    .ToList();

但这里我得到了低于异常

The query results cannot be enumerated more than once.

所以我把上面的逻辑改成了下面这样:

    totalRecords = pageContext.ExecuteQuery<View_ManagerExpenseReportSearchList>(selectQuery).Count();
    result = pageContext.ExecuteQuery<View_ManagerExpenseReportSearchList>(selectQuery).Skip(skip)
                        .Take(resultsPerPage).AsQueryable()
                        .ToList();

这里我只是想知道,在获取总记录计数时,b/w (select * from table).Count()(select ID from table).Count()是否有任何性能差异

我想同时获取数据和记录计数

由于您没有读取所有数据,(分页逻辑)您无法计算检索到的List。所以你所拥有的看起来不错。

唯一的问题是计数应该在READ之前还是之后。

我会测试两者。我希望DB可以在读取后更容易地传递计数。在场景中,一个页面是所有项目。页面很可能仍在数据库缓冲区(服务器内存)中并且可以容易地返回计数。

对于您期望的数据量,在目标数据库上有经验的DBA是最好的人选。

如果您只需要我建议的记录计数
从表中选择计数(1)
它将只返回一个数字用于记录计数

从表中选择*
将返回所有列,即使此数据不需要SQL引擎执行查询的更多时间以及通过网络消耗的更多带宽

从表中选择Id
将只返回Id列,这意味着SQL引擎执行查询的时间更短并且通过网络消耗的带宽更少

最新更新