• C# 数据分页


    背景

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

    分析

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

    • 前端的我当年也用过原生的html以及使用EasyUI框架提供的方法,不过现在嘛,嘿嘿,一直写接口,不太会了,百度一下,应该也还行
    • 后端的话其实可以分真分(其实就是数据库分页)假分,假分就是在数据库里查出中的数据,然后根据传入的页面page和行数rows,显示数据;后端分页的话如果是List集合(前一篇文章好像有涉及到,而且没数据至少不会报错,不需要用三目去处理一下),就直接用Linq语法,如果是DataTable的话,就可以用AsEnumerable()或者将DataTable转为List再来切分
    • 数据库分页只查询需要的数据(其实也不是,但是算是我目前理解的最真的了吧,因为这里面也涉及到SQL优化的问题,还跟数据量有关)

    辅助工具

    • dll相关
      • System.Linq(后端分页相关,切分数据)
      • System.Collections.Generic(好像AsEnumerable()有用到,不太确定)
    • 开发工具
      • 后端开发 VS 2019
      • 数据库 Dbeaver

    后端代码

    1. DataTable dt = new DataTable();
    2. var Data = dt.Rows.Count > 0 ? dt.AsEnumerable().Skip(--var_page * var_rows).Take(var_rows).CopyToDataTable() : dt;
    3. var Count = dt.Rows.Count > 0 ? dt.AsEnumerable().Count() : dt.Rows.Count;

    注意:这里运用了三目运算符?:,是因为,这个地方如果dt数据为空,切分数据会报错The source contains no DataRows.

    数据库SQL

    1. -- 取数据11-20,也就是rows=10;page=2;但要注意你的数据page是从0开始取数据,还是1开始取数据
    2. SELECT *
    3. FROM (SELECT *
    4. FROM (SELECT ROW_NUMBER () OVER (ORDER BY t.columns) AS rownumber, t.*
    5. FROM (Table) t) p
    6. WHERE p.rownumber <= 20) table_alias
    7. WHERE rownumber > 10;
    8. SELECT *
    9. FROM (SELECT *
    10. FROM (SELECT ROW_NUMBER () OVER (ORDER BY t.columns) AS rownumber, t.*
    11. FROM (Table) t) p
    12. WHERE p.rownumber > 0) table_alias
    13. WHERE rownumber <= 10;

    注意:

    • 取数据11-20,也就是rows=10;page=2;但要注意你的数据page是从0开始取数据,还是1开始取数据
    • 就是那个rownumber大于号也可以反过来用,这个我也就是之前在别人的博客上看到的,但是没记录是谁的博客
    1. --我的新宠,最好用有索引排序的栏位来排序,速度会快很多,
    2. --单ROWNUM <= 6000000的上限大概是六百万,大于这个这个数,查询时间超过一秒
    3. --ROWNUM <= 6000000且table_alias.rowno > 599990,这两个数值越接近,查询速度越慢,两个条件同时满足,大概适用ROWNUM <= 600000(60万的数据),这样分页显示一页十行不超过一秒
    4. SELECT *
    5. FROM (SELECT tt.*, ROWNUM AS rowno
    6. FROM ( SELECT t.*
    7. FROM Table t
    8. ORDER BY CREATEDT DESC) tt
    9. WHERE ROWNUM <= 600000 --and CREATEDT between to_char(sysdate-30,'yyyy-MM-dd') and to_char(sysdate,'yyyy-MM-dd')
    10. ) table_alias
    11. WHERE table_alias.rowno > 599990
    12. ;

    这个嘛,这些SQL都是当时有需求的时候百度写的,现在不过是整理一下,所以验证嘛,我就没弄,你们参考下,我记录下

    參考文章

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

  • 相关阅读:
    【Vue】响应式与数据劫持
    完善系统的最后一公里,增加系统日志功能
    Spring注解-3.自动装配
    移动应用测试场景的五个重点
    3D大模型如何轻量化?试试HOOPS Communicator,轻松读取10G超大模型!
    Android的handler消息收发处理——子线程与主线程(UI线程)间的通信
    java项目_第163期ssm药品电子商城系统_java毕业设计
    微信小程序实现堆叠式轮播
    《垃圾回收算法手册 自动内存管理的艺术》——内存分配(笔记)
    Docker创建mysql容器
  • 原文地址:https://blog.csdn.net/qq_41128526/article/details/127651031