1
votes

ASP.NET MVC - pagination lente Kendo Grid

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

@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)            
        )                   

Qu'est-ce que je pourrais faire de mal?


0 commentaires

3 Réponses :


1
votes

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:

Comment implémenter la pagination côté serveur dans la grille de l'interface utilisateur Kendo côté client dans asp.net mvc

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!


0 commentaires

0
votes

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


1 commentaires

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



1
votes

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


2 commentaires

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.