ASP.NET MVC - медленное разбиение на страницы Kendo Grid - PullRequest
0 голосов
/ 01 марта 2019

Я использую Kendo Grid для отображения моих данных, но когда я загружаю 500K записей, подкачка идет очень медленно.При изменении страницы вызывается функция Read, в результате чего вызывается база данных, в которую каждый раз извлекаются все записи 500K.

VIEW

@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 голосов
/ 01 марта 2019

Почему вы не можете использовать бесконечную прокрутку, которая будет брать кучу записей (вы можете брать, как вам нужно) каждый раз, когда вы прокручиваете вниз?

Ссылка: https://demos.telerik.com/aspnet-mvc/grid/endless-scrolling-remote

0 голосов
/ 20 мая 2019

Натолкнулся на это исследование другой проблемы, но ваша проблема ясна: вы делаете .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);
}
0 голосов
/ 01 марта 2019

Я бы посоветовал сначала попытаться выполнить порядок на стороне данных вместо кода и посмотреть, поможет ли это.Но я не думаю, что это решит проблему, если вы извлекаете 500 тыс. Записей и перемещаете их каждый раз, когда пользователь меняет страницу.Вот как пейджинг на стороне клиента работает в кендо.

Второй вариант - сделать пейджинговую сторону сервера.Вы можете посмотреть этот пост, чтобы узнать, как реализовать это:

Как реализовать подкачку на стороне сервера в сетке пользовательского интерфейса Kendo на стороне клиента в asp.net mvc

Источник информации опроизводительность сетки кендо и подкачка: https://www.telerik.com/blogs/how-to-get-the-best-grid-performance

Надеюсь, это поможет!

...