5

C#のEntityFrameworkでのクエリが遅いという問題があります。ページングを処理するためにPageという拡張メソッドを作成しましたが、これを使用するとクエリが非常に遅くなります。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;
    }
4

1 に答える 1

10

EFが式を処理し、ページネーションを使用してSQLクエリを生成できるように、拡張メソッドはIQueryableを超えている必要があります。

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

于 2012-09-13T14:30:51.110 に答える