C# 数据分页

背景

        其实分页这个功能老早就有了,但是每次都是写着写着就不知道丢哪去了,因为不在一个项目里,也懒得去一个个翻看,而且每次查询给的数据类型还不太一样,不过可以写方法来转,当然我没有写,嘿嘿!

分析

        其实吧数据分页的话,就分前端、后端、数据库三种,我是这么觉得的,以下内容都是我以前可能在哪看到过的和后来自己的一些理解,就这样看着吧,可能也有其它说法。

  • 前端的我当年也用过原生的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都是当时有需求的时候百度写的,现在不过是整理一下,所以验证嘛,我就没弄,你们参考下,我记录下

參考文章

c# DataTable的数据分割成多个、分页_51CTO博客_c# datatable 合并

你可能感兴趣的:(笔记,c#)