背景
其实分页这个功能老早就有了,但是每次都是写着写着就不知道丢哪去了,因为不在一个项目里,也懒得去一个个翻看,而且每次查询给的数据类型还不太一样,不过可以写方法来转,当然我没有写,嘿嘿!
分析
其实吧数据分页的话,就分前端、后端、数据库三种,我是这么觉得的,以下内容都是我以前可能在哪看到过的和后来自己的一些理解,就这样看着吧,可能也有其它说法。
- 前端的我当年也用过原生的html以及使用EasyUI框架提供的方法,不过现在嘛,嘿嘿,一直写接口,不太会了,百度一下,应该也还行
- 后端的话其实可以分真分(其实就是数据库分页)和假分,假分就是在数据库里查出中的数据,然后根据传入的页面page和行数rows,显示数据;后端分页的话如果是List集合(前一篇文章好像有涉及到,而且没数据至少不会报错,不需要用三目去处理一下),就直接用Linq语法,如果是DataTable的话,就可以用AsEnumerable()或者将DataTable转为List再来切分
- 数据库分页只查询需要的数据(其实也不是,但是算是我目前理解的最真的了吧,因为这里面也涉及到SQL优化的问题,还跟数据量有关)
辅助工具
- dll相关
- System.Linq(后端分页相关,切分数据)
- System.Collections.Generic(好像AsEnumerable()有用到,不太确定)
- 开发工具
- 后端开发 VS 2019
- 数据库 Dbeaver
后端代码
DataTable dt = new DataTable();
var Data = dt.Rows.Count > 0 ? dt.AsEnumerable().Skip(--var_page * var_rows).Take(var_rows).CopyToDataTable() : dt;
var Count = dt.Rows.Count > 0 ? dt.AsEnumerable().Count() : dt.Rows.Count;
注意:这里运用了三目运算符?:,是因为,这个地方如果dt数据为空,切分数据会报错The source contains no DataRows.
数据库SQL
-- 取数据11-20,也就是rows=10;page=2;但要注意你的数据page是从0开始取数据,还是1开始取数据
SELECT *
FROM (SELECT *
FROM (SELECT ROW_NUMBER () OVER (ORDER BY t.columns) AS rownumber, t.*
FROM (Table) t) p
WHERE p.rownumber <= 20) table_alias
WHERE rownumber > 10;
SELECT *
FROM (SELECT *
FROM (SELECT ROW_NUMBER () OVER (ORDER BY t.columns) AS rownumber, t.*
FROM (Table) t) p
WHERE p.rownumber > 0) table_alias
WHERE rownumber <= 10;
注意:
- 取数据11-20,也就是rows=10;page=2;但要注意你的数据page是从0开始取数据,还是1开始取数据
- 就是那个rownumber大于号也可以反过来用,这个我也就是之前在别人的博客上看到的,但是没记录是谁的博客
--我的新宠,最好用有索引排序的栏位来排序,速度会快很多,
--单ROWNUM <= 6000000的上限大概是六百万,大于这个这个数,查询时间超过一秒
--ROWNUM <= 6000000且table_alias.rowno > 599990,这两个数值越接近,查询速度越慢,两个条件同时满足,大概适用ROWNUM <= 600000(60万的数据),这样分页显示一页十行不超过一秒
SELECT *
FROM (SELECT tt.*, ROWNUM AS rowno
FROM ( SELECT t.*
FROM Table t
ORDER BY CREATEDT DESC) tt
WHERE ROWNUM <= 600000 --and CREATEDT between to_char(sysdate-30,'yyyy-MM-dd') and to_char(sysdate,'yyyy-MM-dd')
) table_alias
WHERE table_alias.rowno > 599990
;
这个嘛,这些SQL都是当时有需求的时候百度写的,现在不过是整理一下,所以验证嘛,我就没弄,你们参考下,我记录下