Метод Kendo ToDataSourceResult дает исключение тайм-аута для большого количества записей - PullRequest
0 голосов
/ 08 мая 2018

Я использую Kendo Grid, как показано ниже:

Html.Kendo().Grid<MyViewModel>()
.Name("grid")
.Columns(c => c.AutoGenerate(false))
.Filterable(f =>
{
    //coding for filteration
})
.Selectable(selectable => selectable.Mode(GridSelectionMode.Single))
.Reorderable(r => r.Columns(true))
.Pageable(pager => pager
    .Refresh(true)
    //coding for pages
)
.Sortable().Selectable(selectable => selectable.Mode(GridSelectionMode.Multiple))
.Scrollable(s => s.Height(450))
.Filterable()
.Resizable(r => r.Columns(true))
.DataSource(dataSource => dataSource.Ajax()
    .Events(ev => ev.RequestEnd("onRequestEnd"))
    .Sort(sort => { sort.Add(model => model.Date).Descending(); })
    .Filter(f => f.Add(model => model.SerialNo).IsEqualTo((this.Session["Id"] as MyModel).SerialNo)) // Applying Custom Filter
    .PageSize(10)
    .ServerOperation(true)
    .Read(read => read.Action("Read", "Controller").Data("Grid_Index_additionalData")))
 .Events(events => events.DataBound("onDataBound"))
 .Render();

Код в контроллере:

    [OutputCache(Duration = 0, VaryByParam = "None")]
    public ActionResult Read([DataSourceRequest]DataSourceRequest request, string searchBox)
    {
        IQueryable<MyViewModel> filteredResult;

        var collection1 = manager.Model1SelectAll();
        var collection2 = manager.Model2SelectAll();

        filteredResult =    from c1 in collection1
                            join c2 in collection2
                          on c1.SerialNo equals c2.SerialNo 
                              select new MyViewModel
                              {
                                  Prop1 = c1.Prop1,
                                  Prop2 = c1.Prop2,
                                  Prop3 = c1.Prop3,
                                  Prop4 = c1.Prop4,
                                  SerialNumber = c1.SerialNo,
                                  Prop5 = c2.Prop5,
                                  Prop6 = c2.Prop6
                              };

        var result = filteredResult.ToDataSourceResult(request);  
        // filteredResult is IQueryable of around 3 million records
        // filtering these on basis of request.Sorts and request.Filter will give 100 records
        // But I receive TimeOut exception here

        try
        {
            var serializer = new JavaScriptSerializer { MaxJsonLength = int.MaxValue };
            var jsonResult = new ContentResult
            {
                Content = serializer.Serialize(result),
                ContentType = "application/json"
            };

            return jsonResult;
        }
        catch (Exception ex)
        {
            ExceptionService.LogException(ex);
        }
    }

Мой FilterResult содержит 3 миллиона записей, что дает исключение TimeOut при вызове ToDataSourceResult (). Кроме того, если я пытаюсь использовать FilterResult.ToList () =>, это дает мне MemoryException. Я не могу удалить исключение тайм-аута. Кендо говорит, что если мы передадим IQueryable в ToDataSourceResult, он будет обрабатывать всю фильтрацию, но в моем случае это исключение.

Я попытался создать свою собственную альтернативу ToDataSourceResult (), обработав все запросы. Сортировка и фильтры и передача только записей размера страницы с использованием

this.ObjectSet.Where(whereCondition).OrderBy("it." + sortBy).Skip(pageSize * (pageNumber - 1)).Take(pageSize);

Но таким образом я не могу обработать все случаи фильтра и сделать этот метод универсальным для всех сеток в моем проекте.

...