我在写一些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引擎执行查询的时间更短并且通过网络消耗的带宽更少