0

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

JQGrid 调用

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

从 C# 返回的数据

return Json(result, JsonRequestBehavior.AllowGet);

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

我该如何实现呢?

谢谢

4

3 回答 3

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 中所做的一样。

于 2013-03-13T12:37:11.543 回答
0

您必须实施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;

使用上面的参数,然后把条件放在上面的查询中

于 2013-03-13T12:32:40.673 回答
0

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

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

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

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

之后迭代smallResultSet并创建您的 JSONResult。

于 2013-03-13T12:38:04.780 回答