Paging avec PagedList, est-ce efficace?
J'ai essayé de mettre en œuvre la pagination pour un bon moment maintenant et j'ai trouvé ce tutoriel pour la pagination avec MVC: ASP.NET MVC Pagination Fait à la Perfection
Maintenant, dans cette solution, j'ai une requête à la base de données pour la ensemble des clients puis-je retourner une liste paginée des clients au lieu d'une liste normale.
Je trouve cela inquiétant, parce que je ne l'intention de montrer 10 ou 20 entrées par page, et ma base de données facilement plus d'un million d'entre eux. Ainsi, l'interrogation de la base de données à chaque fois que je veux montrer la Index
page semble être une mauvaise solution, au mieux.
Si je suis la compréhension de quelque chose de mal, n'hésitez pas à me couper dès maintenant, mais pour moi cette solution est tout sauf parfait.
Ai-je mal compris quelque chose? Est-il une solution plus efficace ou la bibliothèque pour la pagination avec MVC?
source d'informationauteur Flame_Phoenix
Vous devez vous connecter pour publier un commentaire.
Naturellement pagination exige une connaissance de la totalité des résultats de comptage dans l'ordre de la logique pour déterminer combien de pages il y a des etc. Cependant, au lieu de ramener tous les résultats créez simplement votre requête à la Base de données de retour paginée montant (e.g 30) et ainsi que le nombre de tous les résultats.
Par exemple, si vous avez été en utilisant Entity Framework, ou LINQ2SQL vous pourriez faire quelque chose comme ce
Parce que nous n'avons pas fait .ToList() sur notre jeu de résultats jusqu'à ce que nous avons finalisé ce que nous voulons, nous n'avons pas apporté les résultats en mémoire. Cela se fait lorsque nous appelons la .Premier (le) sur notre jeu de résultats.
Enfin notre Objet que nous nous retrouvons avec (ResultObject) peut être utilisé pour ensuite faire la pagination plus tard. Comme nous avons pu le comte, nous savons déjà ce que nous sommes (les 3 que nous avons sauté 60, avec 30 par page) et nous avons les résultats à afficher.
Plus de la Lecture et de l'Information
Comment: Page dans les Résultats de la Requête
Côté serveur Pagination de l'Entité Cadre
L'exemple sur github montre que c'est à l'aide d'un IQueryable qui est ensuite utilisée par ToPagedList(), ce qui implique que le code est assez optimisé et ne sera pas en soi renvoyer tous les enregistrements...
Regardant le code de la classe PagedList
Donc, comme vous pouvez le voir, il utilise déjà le serveur recommandé pagination côté des méthodes de sauter et de prendre puis de préformes un ToList().
Toutefois, si vous ne travaillaient pas avec un IQueryable, c'est à dire un IEnumerable ensuite le code suivant est utilisé:
Le problème est que selon le type de filtrage utilisé pour l'interface IEnumerable, en premier lieu, pourrait contenir tous les enregistrements, donc utiliser un IQueryable si possible pour une performance optimale de PagedList.
Liés tutoriel qui semble étrange, car il utilise une
List<Client>
. Ce sera en effet apporter à tous les clients dans la mémoire et la page. Au lieu de cela, vous devriez regarder pour des méthodes qui utilisent desIQueryable<T>
spécifiquementSkip
etTake
de sorte que la pagination doit ressembler àEn fonction de ce que les cartographes vous utilisez, vous trouverez des méthodes similaires en EF, NHibernate, Linq-to-SQL etc
Vous avez trois façons de mettre en œuvre la pagination dans votre application:
Repository
pour retourner les Dto avec un minimum de données vers le client, et d'utiliser certaines desjquery
plugins fournir la pagination par eux-mêmes. C'est une manière simple, mais parfois (comme dans votre cas), ce n'est pas une option. Donc, vous avez à mettre en œuvre côté serveur paginationLINQ
extension. Je crois que de nombreux référentiels et de l'ORM est-ce à l'interne (ne fonctionne pas avecEntity Framework
ne peut pas dire à coup sûr). Le problème avec cette solution est que vous avez à synchroniser le cache et db, et vous devez obtenir serveur avec une mémoire suffisante pour stocker toutes vos données (ou allez le cloud, ou de quelque chose). Comme dans d'autres réponses, vous pouvez sauter les pas de besoin de données avec lazyIEnumerable
de travail, de sorte que vous n'avez pas besoin de cache de la collection..SQL
vous pouvez utiliserROW_NUMBER
de la construction, il fonctionne dans MS SQL ou dans Oracle ou dans MySQL (pasROW_NUMBER
lui-même en réalité, la seule analogique). Si vous avezNoSQL
solution, alors vous devez vérifier la documentation.Si vous allez à la page github de la
PagedList
addon vous pouvez voir que si vous avez une méthode retournant unIQueryable<T>
puis le PagedList la magie peut travailler sur que sans retour de chaque élément de la base de données. Si vous ne pouvez pas contrôler ce que la requête de la base de données renvoie à vous, alors vous devez compter sur d'autres méthodes.L'exemple de cette page est ce
De ce composant (PagedList) fonctionne très bien pour un grand nombre d'enregistrements, la première fois et à chaque fois que vous sélectionnez une page qu'il va faire 2 appels à la base de données. Un retour du nombre de dossiers, et les autres se renvoyer uniquement les enregistrements de la page sélectionnée. Assurez-vous de ne pas appeler le ToList() la méthode