C#MVC2 Jqgrid - 服务器端分页的正确方法是什么?

时间:2010-11-15 23:31:02

标签: c# asp.net-mvc-2 linq-to-entities jqgrid paging

我有一个jqgrid,其中数据库表有几千行,但jqrid一次只显示15行。

它应该显示得非常快(查询15行不需要很长时间)。但相反,它需要10 - 20秒,这表明它每次都在检索整个表格。

网格定义如下:

$("#Products").jqGrid({
url: url, mtype: "get", datatype: "json", jsonReader: {
    root: "Rows", page: "Page", total: "Total", records: "Records", repeatitems: false,
    userdata: "UserData",id: "Id"},
colNames: ["Product Id","Product Code", ... etc ],
colModel: [{ name: "Id", ... etc}],
viewrecords: true, height: 400, width: 800, pager: $("#jqgPager"),
rowNum: 15, rowList: [50, 100, 200], 
autowidth: true, multiselect: false

服务器端(MVC2动作)执行此操作:

var model = (from p in products
    select new
    {
    p.Id, p.ProductCode, p.ProductDescription,
    AllocatedQty = p.WarehouseProducts.Sum(wp => wp.AllocatedQuantity),
    QtyOnHand = p.WarehouseProducts.Sum(wp => wp.OnHandQuantity)
    }).AsQueryable();

    JsonResult json = Json(model.ToGridData(
        page, rows, orderBy, "", 
        new[] { "Id", "ProductCode", "ProductDescription", "AllocatedQty", "QtyOnHand" }),
            JsonRequestBehavior.AllowGet);

最后,model.ToGridData扩展方法执行此操作:

var data =_service.GetAll(); 
var page = data.Skip((index) * pageSize).Take(pageSize);
list.Add(page.AsEnumerable);

我有点迷失问题所在:

  • 我是否错误地设置了jqgrid分页选项?
  • 我写过不好的Linq吗? 例如,Sum()会导致所有行被读取吗?
  • 我是否完成了.Skip()。Take()错误?
  • 我完全错过了其他什么吗?

修改

将我的代码与Oleg发布的示例进行比较时,我可以看到我按此顺序执行操作:

  1. GETALL
  2. 选择模型字段
  3. Wheras Olegs样本似乎按此顺序排列:

    1. GETALL
    2. 选择模型字段
    3. 所以我改为更简单的实现:

      public ActionResult GetProductList(int page, int rows, string sidx, string sord, 
      string searchOper, string searchField, string searchString)
      {
              List<Product> products = _productService.GetAllProducts();
              int totalRecords = products.Count();
      
              var pagedData = products.Skip((page > 0 ? page - 1 : 0) * rows).Take(rows);
      
              var model = (from p in pagedData
                          select new
                          {
                              p.Id, p.ProductCode, p.ProductDescription,
                              Barcode = string.Empty, UnitOfMeasure = string.Empty,
                              p.PackSize, AllocatedQty = string.Empty,
                              QtyOnHand = string.Empty }).ToList();
      
              var jsonData = new
              {
                  total = page, records = totalRecords,
                  page = (totalRecords + rows - 1) / rows, rows = model
              };
      
              return Json(jsonData, JsonRequestBehavior.AllowGet);
      }
      

      然而,这有一个新问题:

      A circular reference was detected while serializing an object of type
      'System.Data.Entity.DynamicProxies.Product_FA935D3899E2...
      

      我现在可以看到Oleg的样本的唯一区别是他的getAll返回IQueryable,其中我只是List

1 个答案:

答案 0 :(得分:1)

您应该发布更多完整代码。例如,当前代码中未定义model.ToGridData。如何将index从输入的参数等中解析出来也不清楚。只有model.ToGridData()可以说明您的程序产生的输出是否与您定义的jsonReader相对应。

我建议您查看this旧答案,其中使用了分页和排序。在one more answer中,您会找到更多对代码示例的引用。