5 votes

La pagination de l'Entity Framework avec une méthode d'extension est lente ?

J'ai quelques problèmes avec une requête lente dans Entity Framework en C#. J'ai créé une méthode d'extension appelée Page pour gérer la pagination, mais lorsque je l'utilise, la requête devient vraiment lente. Si je fais simplement .Skip(page.Value * pageSize.Value).Take(pageSize.Value) au lieu d'utiliser Page, la requête est beaucoup plus rapide. Je suppose que l'utilisation de Page permet de récupérer tous les contacts avant la pagination. Existe-t-il un moyen d'éviter cela ou est-ce que je fais quelque chose d'incorrect ?

Requête :

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();

Méthode d'extension :

    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;
    }

10voto

lgoncalves Points 1734

Votre méthode d'extension doit passer par IQueryable pour que EF puisse traiter l'expression et générer la requête SQL avec la pagination.

Puisque vous utilisez IEnumerable, la méthode Page invoquera Skip et Take de IEnumerable. Cela entraînera l'énumération du résultat de la requête qui a été construite jusqu'à ce point (avant l'appel à Page) et effectuera la pagination en mémoire, sur tous les éléments retournés, au lieu d'inclure la pagination dans la requête DB.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X