2015-05-18 64 views
1

目前我們有一個頁面,我們需要分頁所以,我需要2信息
1.獲取行的總數
2.取「N」的行數行
選擇「N」行並獲得使用實體框架

目前,我有2查詢這樣做,對於第1步類似

count = db.Transactions 
      .AsNoTracking() 
      .Where(whereClause 
      .Count(); 

然後

db.Transactions 
      .AsNoTracking() 
      .Where(whereClause 
      .Skip(skipRows) 
      .Take(pagesize) 
      .ToList(); 

有什麼辦法可以優化它嗎?

回答

2

您可以嘗試使用Local Data

// Load all Transactions with filtering criteria into the context 
db.Transactions.AsNoTracking().Where(whereClause).Load(); 

// Get Count 
var transcationsCount = db.Transactions.Local.Count; 

// Paging 
var pagedTranscations = db.Transactions.Local.Skip(skipRows).Take(pageSize).ToList(); 

這隻能導致一個數據庫查詢的初始Load()呼叫被解僱到數據庫中。

+0

我想這將是更昂貴的操作,在內存中加載的所有數據是不是一種選擇,行數是非常大的 –

+1

我認爲這取決於你希望把你的** **的成本在哪裏,你的代碼將兩次打到數據庫(這是網絡綁定)。如果按照我的方式執行,則會受內存/ CPU限制。你應該做更詳細的分析,看看瓶頸在哪裏,並決定在哪裏優化。 – rexcfnghk

0

這會返回給你一個IQueryable,你可以對它做查詢,每個都會執行到db。這樣,您不必在每次要查詢內容時重寫查詢。

var query = (from t in db.Transactions 
      where whereClause 
      select t); 

var count = query.Count(); 

var items = query 
      .Skip(skipRows) 
      .Take(pagesize) 
      .ToList(); 
+0

我已經在做我的項目了,我更關心性能。 –

+0

表現什麼?顯然,如果事務中只有100個左右的項目,那麼在內存中加載它們一次,根據延遲和數據庫性能,執行比訪問數據庫更快的任務。如果行數到達某個點,執行2個查詢的成本效率會更高。 –

+0

查詢預計會獲取數百萬行,這就是爲什麼它需要分頁,如果它會在數千這個問題不會在這裏。 –