我正在编写一些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()
vs (select ID from table).Count()
来获取总记录数
我想要同时获取数据和recordCount
答案 0 :(得分:2)
由于您没有读取所有数据,(分页逻辑)您无法计算检索到的列表。 所以你看起来很好。
唯一的问题是计数应该在READ之前还是之后。
我会测试两者。我希望数据库可以在方案中读取后更容易地传递计数页面是所有项目。页面很可能仍在db buffer(服务器内存)中 它可以轻松返回计数。
目标数据库中有经验的DBA是您最理想的数据量。
答案 1 :(得分:1)
如果你只需要记录数,我建议你
从表格中选择Count(1)
这将只返回一个记录计数
从表格中选择*
即使SQL引擎执行查询不需要更多时间,也将返回所有列
以及通过网络消耗的更多带宽
从表中选择ID
将仅返回Id列,这意味着SQL引擎执行查询的时间更短
通过网络消耗更少的带宽