ASP.NET MVC - Kendo Grid 慢分页

Posted

技术标签:

【中文标题】ASP.NET MVC - Kendo Grid 慢分页【英文标题】:ASP.NET MVC - Kendo Grid slow paging 【发布时间】:2019-07-23 02:40:46 【问题描述】:

我正在使用 Kendo Grid 来显示我的数据,但是当我加载 500K 记录时,分页速度非常慢。更改页面时,会调用 Read 函数,从而调用数据库,每次都会在其中检索所有 500K 记录。

查看

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

控制器

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

我做错了什么?

【问题讨论】:

【参考方案1】:

我建议首先尝试在数据端而不是代码上进行排序,看看是否有帮助。但我认为,如果您每次用户更改页面时都检索 500k 记录并移动它们,那么这不会解决问题。这就是客户端分页在剑道中的工作方式。

第二个选项是让分页服务器端。您可以查看这篇文章以了解如何实现它:

How to implement Server side paging in Client side Kendo UI grid in asp.net mvc

关于剑道网格性能和分页的来源: https://www.telerik.com/blogs/how-to-get-the-best-grid-performance

希望对你有帮助!

【讨论】:

【参考方案2】:

在研究另一个问题时遇到了这个问题,但您的问题很明确:您正在执行.ToList(),这会导致在.ToDataSourceResult 开始分页和排序之前获取所有记录(它需要一个 IQueryable)。

因此您的 GetData 需要返回一个 IQueryable 并将操作重构为:

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

【讨论】:

当我删除 ToList() 后,读取请求的速度之快令人惊讶 是的,能够看到数据库调用是关键。调试的时候,我经常会输入一个临时的“ToList”然后去掉。【参考方案3】:

为什么不能使用无限滚动,每次向下滚动时都会占用大量记录(您可以根据需要获取)?

参考链接: https://demos.telerik.com/aspnet-mvc/grid/endless-scrolling-remote

【讨论】:

每次向下滚动时,它都会调用 Read 操作并获取记录,而不是一次拥有所有记录 500k 。会提高你的表现

以上是关于ASP.NET MVC - Kendo Grid 慢分页的主要内容,如果未能解决你的问题,请参考以下文章

在 ASP.NET MVC 上使用 Kendo Grid 更改数据

无法覆盖 Kendo Grid 过滤器消息 (ASP.NET MVC)

如何使用 ASP.NET MVC 在 Kendo UI Grid 中实现 N 级嵌套层次结构

ASP.Net MVC Kendo Grid 的自定义分页

Telerik Kendo UI ASP.NET MVC Grid - 已保存数据项的事件处理

C#(ASP.NET) MVC kendo grid如何绑定一个数据库返回的datatable(要最简单的)