本文技术方案支持.Net/.Net Core/.Net Framework

数据分页,几乎是任何应用系统的必备功能。但当数据量较大时,分页操作的效率就会变得很低。大数据量分页时,一个操作耗时5秒、10秒、甚至更长时间都是有可能的,但这在用户使用的角度是不可接受的……

数据分页往往有三种常用方案。

第一种,把数据库中存放的相关数据,全部读入代码/内存,再由代码对其进行分页操作。

第二种,直接在数据库中对相关数据进行分页操作,再把分页后的数据输出给代码程序。

第三种,先把数据库中的相关数据全部读入“缓存”,再由代码程序对“缓存”中的数据进行读取+分页操作。

本文下面重点阐述第一种与第二种两个解决方案,它们也都是直接基于“数据库”的。

(第三种方案虽然速度较快,但由于需要用到“缓存”这类第三方工具,且在有数据更改时需要较复杂的“数据库-缓存”同步操作,故本文暂不详述。)

◆◆第一种方案如下◆◆

从NuGet引入DeveloperSharp包,初始化IUtility工具

using DeveloperSharp.Framework.CoreUtility;
-------------------------- IUtility IU = new Utility();

IUtility内构建有3个重载的分页PagePartition方法:

PagePartition
声明:PagePiece PagePartition(DataTable Table, int PageSize, int PageIndex)
用途:分页功能
参数:(1)DataTable Table -- 需要分页的DataTable
(2)int PageSize -- 页面大小
(3)int PageIndex -- 当前页码
返回:PagePiece -- 页片实体 PagePartition
声明:PagePiece<List<T>> PagePartition<T>(IQueryable<T> DataList, int pageSize, int pageIndex) where T : class
用途:分页功能
参数:(1)IQueryable<T> DataList -- 需要分页的IQueryable
(2)int PageSize -- 页面大小
(3)int PageIndex -- 当前页码
返回:PagePiece -- 页片实体 PagePartition
声明:PagePiece<List<T>> PagePartition<T>(List<T> DataList, int pageSize, int pageIndex) where T : class
用途:分页功能
参数:(1)List<T> DataList -- 需要分页的List
(2)int PageSize -- 页面大小
(3)int PageIndex -- 当前页码
返回:PagePiece -- 页片实体

分页方法的返回值PagePiece/PagePiece<T>类,包含分页后的数据集、总页数、总数据、当前页码、等等一系列“分页”后经常会用到的数据。PagePiece/PagePiece<T>的属性的详细说明如下:

PageSize
声明:public int PageSize;
用途:int --页面大小 TotalPageNumber
声明:public int TotalPageNumber;
用途:int --总页数 TotalRecordNumber
声明:public int TotalRecordNumber;
用途:int --记录总数 CurrentStartIndex
声明:public int CurrentStartIndex;
用途:int --当前页的记录起始编号 CurrentEndIndex
声明:public int CurrentEndIndex;
用途:int --当前页的记录结束编号 CurrentPageSize
声明:public int CurrentPageSize;
用途:int --当前页的记录数量 CurrentPageIndex
声明:public int CurrentPageIndex;
用途:int --当前页码 Table
声明:public System.Data.DataTable Table;
用途:System.Data.DataTable--当前页的数据表
(或者)
DataList
声明:public List<T> DataList;
用途:List<T>--当前页的数据

◆◆第二种方案如下◆◆

为了演示“第二种分页方案”如何使用,我们首先在Visual Studio中新建一个控制台工程。然后,我们做如下三个操作。

【第一步】:从NuGet引用DeveloperSharp包。

【第二步】:创建一个用来与数据库进行通信的“数据源类”(文本示例为:TestData.cs),内容如下:

using DeveloperSharp.Structure.Model;//DataSource的命名空间
using DeveloperSharp.Framework.QueryEngine;//DatabaseType的命名空间 namespace YZZ
{
[DataSource(DatabaseType.SQLServer, "Server=localhost;Database=Test;Uid=sa;Pwd=123")]
public class TestData : DeveloperSharp.Structure.Model.DataLayer
{
//类中没有任何代码
}
}

说 明 :“数据源类”(文本示例为:TestData.cs)必 须 继 承 自 DeveloperSharp.Structure.Model.DataLayer 类 , 并 且 在 其 上 设 置DataSource属 性 的 初 始 化 值 为“数据库类型”及其“链接字符串”。

【第三步】:为控制台应用类,添加通过“数据源类”(TestData)调用其PagePartition方法进行数据分页的代码。注 意:核心代码就一行而已!!

代码如下:

using DeveloperSharp.Extension;//Table扩展所在的命名空间(.NET6/VS2022用户,则需要在.csproj文件中的<ItemGroup>下添加<Using>标签)
-----------------------------
class Program
{
static void Main(string[] args)
{
TestData td = new TestData(); //分页
var pp = td.PagePartition("select top 5000 * from t_Order where Id>10 order by Id desc", 20, 162); List<Product> Products = pp.Table.ToList<Product>();
foreach (var P in Products)
{
Console.WriteLine(P.Name);
} Console.ReadLine();
}
}

Product类代码如下:

    public class Product
{
public string Id { get; set; }
public string Name { get; set; }
public int Quantity { get; set; }
}

此处的PagePartition方法有两个重载方法,其详细功能说明如下:

PagePartition
声明:public PagePiece PagePartition(string RecordSet, string Id, int PageSize, int PageIndex)
用途:分页功能(有主键)
参数:(1)string RecordSet --需要分页的记录集,可以是表、视图、或者SQL语句
(2)string Id --主键
(3)int PageSize --页面大小
(4)int PageIndex --当前页码
返回:PagePiece --页片实体 PagePartition
声明:public PagePiece PagePartition(string RecordSet, int PageSize, int PageIndex)
用途:分页功能(无主键)
参数:(1)string RecordSet -- 需要分页的记录集,可以是表、视图、或者SQL语句
(2)int PageSize --页面大小
(3)int PageIndex --当前页码
返回:PagePiece --页片实体

注意:

(1)     当你需要分页的数据表有“主键”字段时,使用“分页功能(有主键)”。反之,使用“分页功能(无主键)”。

(2)     RecordSet是你需要分页的“数据总集”的SQL语句。该SQL语句的形式丰富多样,可以带条件、排序、甚至还能是多表的联合查询、等。

【附注】:文中所有示例均已成功运行通过!!技术交流/支持,请微信扫描二维码,备注“进群”!

.Net下的高效分页的更多相关文章

  1. C#高效分页代码(不用存储过程)

    首先创建一张表(要求ID自动编号): create table redheadedfile ( id ,), filenames ), senduser ), primary key(id) ) 然后 ...

  2. 基于Jquery+Ajax+Json+存储过程 高效分页

    在做后台开发中,都会有大量的列表展示,下面给大家给大家分享一套基于Jquery+Ajax+Json+存储过程高效分页列表,只需要传递几个参数即可.当然代码也有改进的地方,如果大家有更好的方法,愿留下宝 ...

  3. T-SQL 使用WITH高效分页

    一.WITH AS 含义     WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候, ...

  4. 简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一

    简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一 分页非为前端分页  和 后端分页,前端分页只有适用于B/S,B/S的呈现速度远远不如C/S,而C/S则没有这个问题,所以分页必然是 ...

  5. Access大数据高效分页语句

    Access大数据高效分页语句 oracle的分页查询可以利用rowid伪列. db2的分页查询可以利用row_number() over()聚合函数. mysql有limit. access仿佛先天 ...

  6. My Sql 高效分页

    /* *普通分页 *在数据文件上偏移1000000查出10条 */ select * from zoldesk_92game_net_ecms_bj where classid=303 ORDER B ...

  7. sql server 2000 单主键高效分页存储过程 (支持多字段排序)

    sql server 2000 单主键高效分页存储过程 (支持多字段排序) Create PROC P_viewPage             /*              nzperfect [ ...

  8. C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序

    /// <summary>/// 单表(视图)获取分页SQL语句/// </summary>/// <param name="tableName"&g ...

  9. SQlserver高效分页,还在使用row_number(),top之类的?

    row_number() ,还是top 这些分页的方法比较老了,效率不是很高效的, Sqlserve2012就有了,效率对比比较明显,尤其是数据比较大的情况下(我们可以观看查询执行计划) Offset ...

随机推荐

  1. windows下docker部署报错

    报错信息:Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:8848 -> 0.0.0 ...

  2. 业务可视化-让你的流程图"Run"起来

    前言 最近在研究业务可视化的问题,在日常的工作中,流程图和代码往往是分开管理的. 一个被维护多次的系统,到最后流程图和代码是否匹配这个都很难说. 于是一直有一个想法,让程序直接读流程图,根据流程图的配 ...

  3. netty系列之:kequeue传输协议详解

    目录 简介 KQueueEventLoopGroup KQueueEventLoop KQueueServerSocketChannel和KQueueSocketChannel 总结 简介 在前面的章 ...

  4. HBuilderX配置外部服务器(tomcat)查看编辑jsp界面

    HBuilderX配置外部服务器(tomcat)查看编辑jsp界面 一.第一种方法,通过启动本地tomcat,查看jsp 在tomcat的webapps目录下创建文件夹HBuilderX 打开HBui ...

  5. dubbo(九):timeout超时机制解析

    在网络请求时,总会有各种异常情况出现,我们需要提前处理这种情况.在完善的rpc组件dubbo中,自然是不会少了这一层东西的.我们只需要通过一些简单的配置就可以达到超时限制的作用了. dubbo的设计理 ...

  6. zip格式文件编码检测

    解压后文件名乱码 由于zip格式文件无编码存储的结构,因此解压时无法知道原先的编码. 当解压zip格式文件时使用的编码和原编码不一致时,就可能会出现解压后文件名乱码问题. 猜测编码 基于上述问题,需要 ...

  7. warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8): No such file or directory

    1)apt-get clean && apt-get update && apt-get install -y locales 2)locale-gen en_US.U ...

  8. 1_day01_java入门

    java入门 学习目标: 1.熟悉计算机编程语言 2.熟练掌握java特点 3.熟练配置java开发环境 4.熟练编写入门程序 5.熟练编写注释信息 一.计算机语言 1.1 什么是编程语言 计算机语言 ...

  9. Scala的基础用法 和 Java相对应学习(二)变量、循环、语法

    一.配置相关环境 1.增加项目 在idea里面创建新的maven项目 2. 在pom文件中增加依赖 <?xml version="1.0" encoding="UT ...

  10. TCP/IP协议三次握手、四次断开

    1.tcp报文格式 1行代表一个字节: 第一行:代表源端口和目的端口,分别占16位: 第二行:32位序列号:表示客户端向服务端发送的报文的序号是多少,这个序号是计算机随机生成的一个代表该报文的唯一标示 ...