2012-09-13 3 views
5

C#でEntity Frameworkのクエリが遅いという問題があります。ページングを処理するために私はPageという拡張メソッドを作成しましたが、私がそれを使用すると、クエリは本当に遅くなります。私がちょうど.Skip(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

EFは、式を処理し、ページネーションとSQLクエリを生成することができるようにあなたの拡張メソッドをIQueryableをかけなければなりません。

IEnumerableを使用しているので、PageメソッドはIEnumerableのSkipとTakeを呼び出します。これにより、そのポイント(ページの呼び出し前)まで構築されたクエリの結果が列挙され、DBクエリにページ区切りを含めるのではなく、返されたすべてのアイテムに対してメモリ内のページネーションが行われます。

関連する問題