.Net下的高效分页
本文技术方案支持.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下的高效分页的更多相关文章
- C#高效分页代码(不用存储过程)
首先创建一张表(要求ID自动编号): create table redheadedfile ( id ,), filenames ), senduser ), primary key(id) ) 然后 ...
- 基于Jquery+Ajax+Json+存储过程 高效分页
在做后台开发中,都会有大量的列表展示,下面给大家给大家分享一套基于Jquery+Ajax+Json+存储过程高效分页列表,只需要传递几个参数即可.当然代码也有改进的地方,如果大家有更好的方法,愿留下宝 ...
- T-SQL 使用WITH高效分页
一.WITH AS 含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候, ...
- 简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一
简单说下 Winform 的分页快速开发框架必须要实现的几个功能之一 分页非为前端分页 和 后端分页,前端分页只有适用于B/S,B/S的呈现速度远远不如C/S,而C/S则没有这个问题,所以分页必然是 ...
- Access大数据高效分页语句
Access大数据高效分页语句 oracle的分页查询可以利用rowid伪列. db2的分页查询可以利用row_number() over()聚合函数. mysql有limit. access仿佛先天 ...
- My Sql 高效分页
/* *普通分页 *在数据文件上偏移1000000查出10条 */ select * from zoldesk_92game_net_ecms_bj where classid=303 ORDER B ...
- sql server 2000 单主键高效分页存储过程 (支持多字段排序)
sql server 2000 单主键高效分页存储过程 (支持多字段排序) Create PROC P_viewPage /* nzperfect [ ...
- C#拼接SQL语句,SQL Server 2005+,多行多列大数据量情况下,使用ROW_NUMBER实现的高效分页排序
/// <summary>/// 单表(视图)获取分页SQL语句/// </summary>/// <param name="tableName"&g ...
- SQlserver高效分页,还在使用row_number(),top之类的?
row_number() ,还是top 这些分页的方法比较老了,效率不是很高效的, Sqlserve2012就有了,效率对比比较明显,尤其是数据比较大的情况下(我们可以观看查询执行计划) Offset ...
随机推荐
- HHL论文及代码理解(Generalizing A Person Retrieval Model Hetero- and Homogeneously ECCV 2018)
行人再识别Re-ID面临两个特殊的问题: 1)源数据集和目标数据集类别完全不同 2)相机造成的图片差异 因为一般来说传统的域适应问题源域和目标域的类别是相同的,相机之间的不匹配也是造成行人再识别数据集 ...
- 使用docker buildx打包发布多平台镜像
2022-07-07 个人比较喜欢影视作品,下载了大量的剧集视频,有些文件的命名不规范,就需要重新命名,之前是用的一款 renamer 客户端软件,用起来不太爽就自己做了个 bs 架构的重命名软件并开 ...
- CSS 浮动 (二)
CSS 浮动 本人是一名大二学生,欢迎大家进行交流 V15774135883 推荐一个是自学的网站 里面有超多培训机构的大课,地址 有需要可以加我免费拿! 传统网页布局的三种方式 网页布局的本质--用 ...
- [原创]移远RM500U-CN模组驱动移植
1. 简介 中国广电正式放号了,为了支持广电700MHz的5G基站,需要换用新的5G模组.移远通信的RM500U模组正好可以满足我们的使用要求; 我们选用该模组的原因:双卡单待 支持SIM卡热插拔 支 ...
- CD 从抓轨到搭建流媒体服务器 —— 以《月临寐乡》为例
2022-07-19 v0.0.1 由于某些原因,进了 Static World 的群并入坑了 月临寐乡 ,梦开始了.作为幻想乡的新人,也算是有了自己喜欢的社团.但是更细节的东西,狐狐脑子一下子塞不下 ...
- IP地址和端口号
IP地址 IP地址:指互联网协议地址(Internet Protocol Address),俗称IP.IP地址用来给一个网络中的计算机设备做唯一的编号.加入我们吧"个人电脑"比作一 ...
- 字符串的操作和MAth工具类
字符串的操作 常用方法 判断功能方法 equals(String s)判断两个字符串是否相同,区分大小写 equsalsignorecase(String s) 判断两个字符串是否相同,不区分大小写 ...
- 零基础学Java(13)方法参数
前言 首先回顾一下在程序设计语言中关于如何将参数传递给方法的一些专业术语.按值调用表示方法接收的是调用者提供的值.而按引调用表示方法接收的是调用者提供的变量地址.方法可以修改按引用传递的变量的值,而不 ...
- ASP.NET Core 5.0中的Host.CreateDefaultBuilder执行过程
通过Rider调试的方式看了下ASP.NET Core 5.0的Web API默认项目,重点关注Host.CreateDefaultBuilder(args)中的执行过程,主要包括主机配置.应用程 ...
- Excelize 2.3.1 发布,Go 语言 Excel 文档基础库,支持加密表格文档
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准.可以使用它来读取.写入由 Microsoft Exc ...