过滤、排序和拆分页面方法的最快方法

Posted

技术标签:

【中文标题】过滤、排序和拆分页面方法的最快方法【英文标题】:fastest way to Filter, Order and split in pages method 【发布时间】:2017-06-01 15:34:13 【问题描述】:

我想从数据库中获取数据,以显示在页面上。表中有大量行,所以我使用页面来避免永远滚动。

我有搜索字词(没有特定列)、按任何列排序、显然可以更改页面大小和我所在的页面的功能。

理论上,我可以只向数据库询问所有内容(SELECT * FROM myTable),将其发送到我的 html 视图,然后完全在 javascript 中处理数据。问题是,有这么多的数据,使用我的结构(页面控制器调用我的主逻辑,它调用一个 web 服务,它调用数据库)非常慢,有时等待页面的原始加载长达 20 秒。加载后,javascript 通常很快。

或者,我可以使用 Linq 在控制器中完成大部分工作。我也可以在网络服务(它是我的)中完成工作,仍然在 Linq 中。或者,我可以直接使用 WHERE、ORDER BY、COUNT 和一堆动态 SQL 请求,以便立即从数据库中获得我想要的内容。但其中任何一个都会迫使我在每次参数更改时刷新页面。

所以我想知道性能。例如,哪个更快:

var listObjects = ExecuteSQL("SELECT * FROM myTable");
return listObjects.Where(x => x.field == word).OrderBy(x => x.field);

var listObjects = ExecuteSQL("SELECT * FROM myTable WHERE field = :param1 ORDER BY field", word);
return listObjects;

在哪些特定情况下使用我提到的不同方法会更好或更差?

【问题讨论】:

【参考方案1】:

没有。

您想要在您的 dataserver 上选择一个 data 块(整页)。这就是它的工作;它知道如何做到最好。

所以,忘记ExecuteSQL。你几乎关闭了一切帮助你的能力。试试 LINQ:

  var page = (from m in MyTable
              where m.field == param1
             orderby m.field
             select m)
             .Skip((nPage-1)*pageLength).Take(pageLength);

这将生成准确的 SQL 来告诉数据服务器只返回您想要的行。

【讨论】:

以上是关于过滤、排序和拆分页面方法的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

记住(持久化)jqGrid的过滤器、排序顺序和当前页面

按价格对 Mongodb 数据进行排序

PC端网页vue项目,页面滚动点击悬浮按钮最快的方法

PC端网页vue项目,页面滚动点击悬浮按钮最快的方法

自动分页和排序和过滤到剃须刀页面脚手架

按属性过滤器不同选择对产品进行排序