|
【前言】
本文讲述的.NET数据分页方法为【史上最强】,已被多家大型科技公司实战采用 & 也被圈内多家知名IT培训机构转载收藏。
【正文】
支持.Net Core(2.0及以上)与.Net Framework(4.5及以上)
可以部署在Docker, Windows, Linux, Mac。
数据分页,几乎是任何应用系统的必备功能。但当数据量较大时,分页操作的效率就会变得很低。大数据量分页时,一个操作耗时5秒、10秒、甚至更长时间都是有可能的,但这在用户使用的角度是不可接受的……
数据分页往往有三种常用方案。
第一种,把数据库中存放的相关数据,全部读入代码/内存,再由代码对其进行分页操作。
第二种,直接在数据库中对相关数据进行分页操作,再把分页后的数据输出给代码程序。
第三种,先把数据库中的相关数据全部读入“缓存”,再由代码程序对“缓存”中的数据进行读取+分页操作。
本文下面重点阐述第一种与第二种两个解决方案,它们也都是直接基于“数据库”的。
(第三种方案虽然速度较快,但由于需要用到“缓存”这类第三方工具,且在有数据更改时需要较复杂的“数据库-缓存”同步操作,故本文暂不详述。)
◆◆第一种方案如下◆◆
从NuGet引入DeveloperSharp包,然后像如下那样使用分页功能:- using DeveloperSharp.Extension;
- --------------------------
- var Page1 = DataAll.PagePartition(20, 5);
复制代码 其中,要被分页的DataAll对象可以是List、IQueryable、IEnumerable、等任何集合类型。
PagePartition方法的第一个参数是“页大小”,第二个参数是“页序号”,即:PagePartition(int pageSize, int pageIndex)
分页后的返回值Page1的类型是:PagePiece,它包含分页后的数据集、总页数、总数据、当前页码、等等一系列“分页”后经常会用到的数据。PagePiece对象内包含的属性的详细说明如下:- DataList
- 声明:public IEnumerable<T> DataList;
- 用途:IEnumerable<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 --当前页码
复制代码 以上,即是全网最简单的“分页”方法。此方法不仅简单,还有两大额外好处。
其一是:方法返回对象中,已自动包含了“分页”后后续操作所需的全部相关数据(见上述8个),不需再做额外计算处理。
其二是:此方法已自动处理过传入“页序号”为负数、或、大于总页数、等等意外情况,稳定性极高。
◆◆第二种方案如下◆◆
为了演示“第二种分页方案”如何使用,我们首先在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语句的形式丰富多样,可以带条件、排序、甚至还能是多表的联合查询、等。
(上述的这第二种分页方案,引为经典,已被多家大型科技公司采用,还曾被知乎、CSDN推荐到相关技术主题的首页。但美中不足是:此方案现在仅仅只支持SqlServer数据库!!)
运行有问题,需要技术支持?以及bug提交通道,请添加微信:894988403
运行有问题,需要技术支持?以及bug提交通道,请添加微信:894988403
在技术越来越卷的今天,如果没点真水平,很难立足下去。为了答谢各位兄弟们的长期关注,特限时免费推出三套热门技术视频资源:
资源1:高薪热门【WPF上位机+工业互联网】从零手写实战
回复wpf免费领取
资源2:C#+Halcon机器视觉零基础实战教程
回复halcon免费领取
资源3:.Net7 CLR+JIT+MSIL顶级技术视频教程免费分享
回复dotnet免费领取
扫描下方二维码关注公众号(或搜索:eyuan365)。后台回复获取上述资源。
来源:https://www.cnblogs.com/digital-college/archive/2023/08/23/17652562.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|