ASP.NET MVC-Kendo Grid慢速分页

时间:2019-03-01 05:09:16

标签: c# asp.net-mvc kendo-ui kendo-grid kendo-asp.net-mvc

我正在使用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);
}

我可能做错了什么?

3 个答案:

答案 0 :(得分: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

希望有帮助!

答案 1 :(得分:0)

为什么不能使用“无休止滚动”功能?每次向下滚动时,它都会记录一堆记录(您可以根据需要进行记录)?

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

答案 2 :(得分:0)

对此问题进行了研究,但问题很明显:您正在做.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);
}