4

我在这里阅读了几篇文章以及 Telerik 网站上的教程,但缺少它们 - 并且文档已关闭。希望在阅读数小时后快速修复。

我正在尝试使用具有大量行(1M)的剑道网格。在网站上的示例中,我看到视图控制器操作正在返回整个数据集。获取所有行是非常昂贵的过程,并且数据集非常庞大。

我的问题是如何配置网格,以使每个后续回调都返回下一页并且初始调用不会一次获取所有行?

我的代码类似于:

//Main controller action
    public ActionResult Index()
    {
                List<items> listItems = GetAllItems(); // very expensive call!

                return View(listItems);
    }

// my view for that action
    @(Html.Kendo().Grid(Model)
        .Name("grid")
        .Columns(columns =>
          {
              //some columns...
          })

        .Pageable(page=>page.PageSizes(true)) //Enable paging - I suspect here I can fix
         .DataSource(datasource =>datasource.Ajax().PageSize(20).Read(read => read.Action("MoreItems", "Index")).ServerOperation(true)) // tried all sorts of things here
         .Sortable()
         .Filterable()
    )


// the callbacks for the ajax
    public ActionResult MoreItems([DataSourceRequest] DataSourceRequest request)
            {
                return Json(GetAllItems().ToDataSourceResult(request));
    }
    //add some cache just to see what was holding the thing up
    [OutputCache(Duration = 3600, VaryByParam = "none")]
    private static List<items> GetAllItems()
    {
        //some code to retrieve items
    }

(从示例看来,初始调用正在返回完整模型 - 并且对 Products_Read 的后续调用在过滤器对象上。如何过滤初始调用但允许将来分页 - 在我的情况下,我有 100k+ 行并且不可能做到“返回视图(模型”))谢谢!

4

2 回答 2

5

似乎对剑道信息不太幸运......您正在寻找的东西被称为(此处serverPaging框架 DataSource 下的文档)。

对于您的服务器将收到的每个请求:

  • take包含要检索的记录数
  • skip从数据集的前面开始读取多少条记录
  • page当前数据页的索引
  • pageSize每页的记录数

您也可以考虑使用scrollable.virtual此处的文档,当您在网格中向下滚动时会加载以下页面。

此示例 ( http ://demos.kendoui.c​​om/web/grid/remote-data.html ) 使用serverPaging.

于 2013-02-17T19:53:59.187 回答
2

看来您对LINQ 表达式引擎并不熟悉。永远不会检索整个集合。ToDataSourceResult方法正是这样做的——在数据库级别应用分页/排序/分组(感谢该表达式引擎)。

您不必做任何事情 - 只需将 IQueryable 集合(包含所有记录)传递给 DataSourceResult,不要在此之前调用 ToList(或类似的东西),否则魔法将被打破:)

于 2013-02-17T20:04:09.440 回答