代码之家  ›  专栏  ›  技术社区  ›  JK.

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

  •  1
  • JK.  · 技术社区  · 15 年前

    我有一个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. 获取
    2. 选择模型字段
    3. 第页

    Wheras Olegs样品的顺序如下:

    1. 获取
    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...
    

    我现在能看到的唯一区别是奥列格的样本是他的getAll返回 IQueryable 我的只是 List .

    1 回复  |  直到 15 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    你应该发布更多完整的代码。这个 model.ToGridData 例如,未在当前代码中定义。你怎么笑的 index 从输入参数等方面也不清楚。只有 model.ToGridData() 可以说程序产生的输出是否与 jsonReader 你定义的。

    我建议你看看 this 旧的答案,这里同时使用分页和排序。在 one more answer 您将发现更多代码示例的引用。