【问题标题】:Server side paging and sorting Best practice?服务器端分页和排序最佳实践?
【发布时间】:2012-09-13 22:37:54
【问题描述】:

我正在使用以下方法为我的 jqgrid 的子网格获取数据,并且它的工作完全正常。

请注意,此方法用于实现服务器端排序和分页。

现在我的查询就像你在该行中看到的那样

List<SomeEntity> myList = _service.GetSomeData(id); 这里进行了数据库调用并获取了所有记录。

所以我不是很确定,所以我只是想知道这是否符合实现服务器端分页的最佳实践和

public JsonResult GetData(string folderId, string sidx, string sord, int page, int rows) {
    int id = int.Parse(folderId);
    List < SomeEntity > myList = _service.GetSomeData(id);

    const int pageSize = 5;

    // total
    double totalPages = Math.Ceiling((double) myList.Count() / pageSize);

    // sort
    if (sord == "asc") {
        myList = myList.OrderBy(m = > m.Name).ToList();
    }
    else {
        myList = myList.OrderByDescending(m = > m.Name).ToList();
    }

    // paging
    myList = myList.Skip((page - 1) * pageSize).Take(pageSize).ToList();

    var jsonData = new {
        total = totalPages, records = domainList.Count, page,

        rows = myList
    };

    return Json(jsonData, JsonRequestBehavior.AllowGet);
}​

【问题讨论】:

  • 这个问题你可能不得不问自己这是否完全有必要。您可以使用可以处理大量数据的许多不同组件(slickgrid、jqGrid、数据表等)通过前端处理分页和排序。想要在服务器端做的原因是什么?
  • 通常,在服务器端处理它会减少发送到客户端的数据量 - 如果它们处于绳索连接上,这很方便。也意味着在页面之间导航将获取自加载第一页以来输入的任何新数据
  • 谢天谢地,如今绳索连接已成为少数,因为大多数人都有宽带连接。是否有机会通过移动设备使用此网站?
  • @logicalChimp 同意,但有一些方法可以使用时间戳来处理这个问题。我做了一个非常相似的事情,但定期询问服务器“自这个时间戳以来发生了什么变化”(通过 ajax),我只取回通常非常小的最新变化(然后动态更新网格)。最初页面的第一次加载接收到的数据量最大(因为 timstamp 为 0),但我们没有遇到大量 json 数据的任何问题。
  • 如果您使用客户端排序/分页,您如何处理IE7/8 200+记录变得非常缓慢的情况?

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


【解决方案1】:

看起来您正在从服务 (_service) 返回所有数据,然后对结果进行分页。此外,看起来您每次发出寻呼请求时都会发出相同的请求。如果属实,那么我认为这是低效的。

您的服务 (_service) 应该处理 Take 和 Skip 功能(作为参数传递),从而减少通过网络获取和发送的记录数量。您没有发布 GetSomeData(id) 方法的代码。它是返回 IEnumerable 还是 IQueryable?这也会对性能/效率产生影响。

希望我没有误解您的代码或问题。

【讨论】:

  • 是的,就是这样,我应该在查询我的数据库时使用 take 和 skip 方法,并且一次只获取 5 个所需的数据。谢谢大佬!
【解决方案2】:

您的主要问题是将_service.GetSomeData(id) 的结果分配给List&lt;SomeEntity&gt;。在任何情况下,您都应该使用ObjectQuery&lt;SomeEntity&gt;IQueryable&lt;SomeEntity&gt;(取决于所使用的数据库技术)以便能够在SQL Server 端 使用排序和配对。您当前的代码只是获取所有数据,然后对其进行排序并在下一条语句中获取所需的页面。我可以建议您查看来自 the answer 的代码或来自 another answer 的更新代码,更多示例如何为 jqGrid 实现数据的排序、分页和过滤。

【讨论】:

    猜你喜欢
    • 2010-12-21
    • 1970-01-01
    • 2018-03-06
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 2013-02-25
    相关资源
    最近更新 更多