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

2023-12-04

我有一个 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() ?
  • 我完全错过了其他东西吗?

EDIT

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

  1. getAll
  2. 选择模型字段
  3. page

而 Olegs 样本似乎按以下顺序排列:

  1. getAll
  2. page
  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.


您应该发布更完整的代码。这model.ToGridData例如,当前代码中未定义。你如何计算index从输入参数等等也不清楚。只拥有model.ToGridData()人们可以说你的程序产生的输出是否对应于jsonReader你定义的。

我推荐你看一下this旧答案,其中同时使用分页和排序。在还有一个答案您将找到更多代码示例参考。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# MVC2 Jqgrid - 进行服务器端分页的正确方法是什么? 的相关文章

随机推荐