J'utilise Kendo Grid pour afficher mes données, mais lorsque je charge 500K enregistrements, la pagination est très lente. Lors de la modification d'une page, la fonction Lire est appelée, ce qui entraîne un appel à la base de données dans laquelle tous les 500K enregistrements sont récupérés à chaque fois.
VUE
public ActionResult ReadData([DataSourceRequest] DataSourceRequest request, string searchText) { var data = GetData(searchText).ToList(); return Json(data.OrderBy(x=>x.UserId).ToList().ToDataSourceResult(request), JsonRequestBehavior.AllowGet); }
Qu'est-ce que je pourrais faire de mal? @Html.Kendo().Grid<MyViewModel>()
.Name("grid")
.Columns(c=>
{
c.Bound(model => model.UserId);
c.Bound(model => model.UserName);
c.Bound(model => model.Email);
})
.Filterable()
.Sortable()
.DataSource(dataSource => dataSource
.Ajax()
.Read(read => read.Action("ReadData", "Home").Data("filters"))
.PageSize(30)
)
3 Réponses :
Je vous conseille d'essayer d'abord de faire la commande du côté des données au lieu du code et de voir si cela aide. Mais je ne pense pas que cela résoudra le problème si vous récupérez 500 000 enregistrements et que vous les déplacez à chaque fois que l'utilisateur change une page. C'est ainsi que fonctionne la pagination côté client dans kendo.
La deuxième option serait de créer le côté serveur de pagination. Vous pouvez consulter ce post pour voir comment mettre en œuvre cela:
Source sur les performances et la pagination de la grille de kendo: https://www.telerik.com/blogs/ comment-obtenir-les-meilleures-performances-de-grille
J'espère que cela aide!
Pourquoi ne pouvez-vous pas utiliser le défilement sans fin, cela prendra beaucoup d'enregistrements (que vous pouvez prendre selon vos besoins) à chaque fois que vous faites défiler vers le bas?
Lien de référence: https://demos.telerik.com/aspnet-mvc/grid/ télécommande à défilement sans fin
Chaque fois que vous faites défiler vers le bas, il appellera l'action Lire et obtiendra les enregistrements, en n'ayant pas tous les enregistrements à la fois 500k. Augmentera vos performances
Je suis tombé sur ce problème en recherchant un autre problème, mais votre problème est clair: vous faites .ToList ()
qui provoque une extraction de tous les enregistrements avant que .ToDataSourceResult
ne démarre avec la pagination et le tri (il attend un IQueryable).
Donc, votre GetData doit renvoyer une action IQueryable et refactor à:
public ActionResult ReadData([DataSourceRequest] DataSourceRequest request, string searchText) { var data = GetData(searchText); // Add a default sort if none is selected, otherwise use the user selected sort if (request.Sorts.Count == 0) { request.Sorts.Add(new SortDescriptor("UserId", ListSortDirection.Ascending)); } // Will add `Take`, `Skip`, `OrderBy`, etc. before sending to server return Json(data.ToDataSourceResult(request), JsonRequestBehavior.AllowGet); }
C'est incroyable à quel point cela a rendu la demande de lecture plus rapide une fois que j'ai supprimé ToList ()
Ouais, il est essentiel de pouvoir voir les appels de la base de données. Lors du débogage, je vais souvent entrer une "ToList" temporaire puis la supprimer.