2016-09-28 48 views
-2

我正在使用實體框架來獲取包含數百萬條記錄的表的簡單行數,而且我不想要任何where子句。 我嘗試使用Count方法,但取得計數需要很長時間。有沒有什麼有效的方法來等待那麼久呢?使用實體框架獲取大表的行數

+3

你有示例代碼?如果您使用'Count()'的IEnumerable版本,您的應用程序將檢索所有行並對其進行計數。如果您使用'Count()'的'IQueryable'版本,則數據庫服務器將執行count操作,並且_should fast_。 – Howwie

+1

你可以顯示你的代碼到目前爲止? – Sampath

+0

只需對數據庫執行原始SQL查詢。這是實現這一目標的最快方法。 https://msdn.microsoft.com/en-us/data/jj592907.aspx – hellwd

回答

2

您可以嘗試如下所示。此查詢將返回一個IQueryable結果。這意味着count操作發生在數據庫中。

基於查詢的:

var countVal = (from a in context.yourTable 
       select a).Count(); 

方法基於:

var countVal = context.yourTable.Count() 
+1

或乾脆'context.yourTable.Count()' – jeroenh

+0

做到了。謝謝:) @ jeroenh – Sampath

+0

@Sampath謝謝了。 它拯救了我的一天:) –

3

我覺得你首先檢索所有記錄,然後指望他們。你應該直接計數你的記錄。

using(DatabaseContext db = new DatabaseContext()) 
{ 
    //what I think you are doing: 
    int countLong = db.UserAccount.ToList().Count(); 
    //what you should be doing 
    int countShort = db.UserAccount.Count(); 
    //include where clauses inside count, wrong way: 
    int countLong2 = db.UserAccount.ToList().Count(x => x.Active); 
    //include where clauses inside count, good way: 
    int countShort2 = db.UserAccount.Count(x => x.Active); 

    //or if you don't like lambda expressions. 
    int countLong3 = (from x in db.UserAccount 
         //where x.Active //optional 
         select x).ToList().Count(); 

    int countShort3 = (from x in db.UserAccount 
         //where x.Active //optional 
         select x).Count(); 

} 

DatabaseContext將是你的類,它擴展DbContext