2014-10-16 92 views
1

我写了一些LINQ查询我遇到以下情形哪里传来:。LINQ到SQL( '选择表*')COUNT()VS( “选择表列”)COUNT()

我想对一些过滤

在这里我要采取一切记录计数也取使用LINQ基地从数据库的记录,所以我不喜欢下面

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

回答

1

如果你只需要th e记数,我建议
SELECT COUNT(1)从表
将从表只返回一个号码记录计数

选择*
将返回即使不需要该数据中的所有列更多的时间用于SQL引擎执行查询 并通过网络从表
WIL消耗

选择ID更多的带宽l仅返回Id列,这意味着SQL引擎执行查询的时间更少 以及通过网络消耗的带宽更少

+1

如何解决你想要数据和行数的情况...比方说,分配一个足够大的数据结构来保存结果? – Pimgd 2014-10-16 13:00:06

2

由于您不读取所有数据(分页逻辑),因此您无法计算检索到的列表。 所以你有什么看起来好。

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

我会测试两个。我希望数据库可以在场景中读取所有项目后更轻松地提供计数。页面很可能仍然在db缓冲区(服务器内存) 中,并且它可以很容易地返回计数。

针对您预期数据量的目标数据库的经验丰富的DBA是最佳人选。