2014-10-16 114 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是最佳人選。