2012-09-13 49 views
5

我在C#中的實體框架中查詢緩慢時遇到了一些問題。我創建了一個名爲Page來處理分頁的擴展方法,但是當我使用它時,查詢變得非常慢。如果我只是做.sip(page.Value * pageSize.Value).Take(pageSize.Value)而不是使用Page查詢得到更快。我想這樣做與頁面在分頁之前獲取所有聯繫人。有沒有辦法來防止這種情況,還是我在做其他事情?使用擴展方法的實體框架分頁速度很慢?

查詢:

var contacts = db.Contacts 
         .Where(x => x.AccountID == accountID && x.Deleted == false) 
         .OrderByDescending(x => x.FirstName) 
         .ThenBy(x => x.LastName) 
         .ThenBy(x => x.CreatedDate) 
         .Page(page, pageSize); 

return contacts.ToList(); 

擴展方法:

public static IEnumerable<T> Page<T>(this IEnumerable<T> elements, int? page, int? pageSize) 
    { 
     if (page.HasValue && pageSize.HasValue) 
      return elements.Skip(page.Value * pageSize.Value).Take(pageSize.Value); 
     else 
      return elements; 
    } 

回答

9

你的擴展方法應該是在IQueryable的,使EF可以處理的表達併產生分頁的SQL查詢。

由於您使用IEnumerable,因此Page方法將調用Skip和Take的IEnumerable。這將導致建立到該點的查詢結果(在頁面調用之前)的枚舉,並在內存中對所有返回的項目進行分頁,而不是在數據庫查詢中包含分頁。