【问题标题】:JQGrid Get page level data at a timeJQGrid 一次获取页面级数据
【发布时间】:2013-03-13 12:27:16
【问题描述】:

目前我已经实现了 jqgrid,它从数据库中获取数据并将 JSON 数据返回到 JQGRID。

JQGrid 调用

        rowNum: 10,
        rowList: [5, 10],
        url: "/Home/GetDataFromEntity"

从 C# 返回的数据

return Json(result, JsonRequestBehavior.AllowGet);

我正在尝试的是,如果页面有 10 条记录,只有 10 条我想从数据库中获取,如果他们点击到下一页,我想获取接下来的 10 条数据,因为如果数据很大,我不想带来所有数据到内存,我认为这将是一个性能命中。

我该如何实现这个?

谢谢

【问题讨论】:

    标签: c# jquery asp.net-mvc jqgrid


    【解决方案1】:

    这很简单。基本上,您需要做的就是实现分页,您只需向数据库询问您要显示的数据页面。您将看到 jqGrid 将向您的控制器提供此信息,以便您可以在检索数据时使用。

    控制器将通过以下方式获取这些数据(我不知道你的后端技术堆栈,所以这里是 C# 代码):

    public ActionResult GridDataFetch(string sidx, string sord, int page, int rows, bool _search, string filters)
    {
    ....
    

    然后,当您检索数据时,您可以向数据库询问用户想要的数据页面,而无需检索整个数据集。这可能比看起来更复杂,但对于基础来说,它就像(再次使用 C# 代码)一样简单

    var pagedQuery = dataset.OrderBy(sidx + " " + sord).Skip((page - 1) * rows).Take(rows);
    

    您可以在上面看到我们以用户指定的方式对数据进行排序,jqGrid 与sidx & sord 一起传递,然后我们通过skip跳过我们感兴趣的页面之前的所有记录,然后我们使用我们感兴趣的rows。这又是一种用于抓取数据页面的 C# 方法,但任何设置都应该具备基础知识。作为旁注,如果您通过网格或其他逻辑进行任何过滤,您将在此调用之前过滤您的数据集。

    然后,您将像通常在 JSON 中一样传递此分页查询。

    【讨论】:

      【解决方案2】:

      您需要为此使用分页。您可以在服务器端使用.Take.Skip 方法

      获得结果集后,您可以执行以下操作

      var smallResultSet = fullResultSet.Skip(request.PageIndex * request.RecordsCount).Take(request.RecordsCount).ToList();
      

      在这里,我假设您在fullResultSet 变量中获取结果集,而不是对其进行过滤并将其存储在smallResultSet 中。当您将网格绑定到控制器操作时,将传递请求参数。

      之后遍历 smallResultSet 并创建您的 JSONResult。

      【讨论】:

        【解决方案3】:

        你必须实现 server side pagination 来实现这一点。

        我在java中实现了这样的:(你使用的是c#)

        int limit = Integer.parseInt(request.getParameter("rows")); // get how many rows we want to have into the grid
        String sidx = request.getParameter("sidx"); // get index row - i.e. user click to sort
        String sord = request.getParameter("sord"); // get the direction
        int start = (limit* page) - limit;
        String rows = request.getParameter("rows");
        
        String query = "select * from ( select a.*, ROWNUM rnum from ( select * from CRM_PROT_STAGES  where  PROTOCOL_ID = '"+param +"' ) a where ROWNUM <= "+ limit +")where rnum  >="+start;
        

        使用上面的参数,然后像上面一样将条件放入查询中

        【讨论】:

        • 有什么例子吗?
        猜你喜欢
        • 2020-04-06
        • 1970-01-01
        • 2012-06-20
        • 1970-01-01
        • 2021-05-23
        • 2019-01-05
        • 2012-02-22
        • 2023-03-16
        • 2018-09-21
        相关资源
        最近更新 更多