首页 > 其他分享 >史上最强.NET数据分页方法

史上最强.NET数据分页方法

时间:2023-08-23 19:24:13浏览次数:49  
标签:PagePartition 分页 int -- 最强 NET public string

【前言】

本文讲述的.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<T>、IQueryable<T>、IEnumerable<T>、等任何集合类型。

PagePartition方法的第一个参数是“页大小”,第二个参数是“页序号”,即:PagePartition<T>(int pageSize, int pageIndex)

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

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)。后台回复获取上述资源。

 

标签:PagePartition,分页,int,--,最强,NET,public,string
From: https://www.cnblogs.com/digital-college/p/17652562.html

相关文章

  • kubernetes-1.26安装
    一、环境准备k8s集群角色IP主机名安装组件配置控制节点192.168.10.10masterapiserver、controller-manager、scheduler、etcd、kube-proxy、docker、calico、contained2核4G工作节点192.168.10.11node1kubelet-1.26、kube-proxy、docker、calico、coredns、c......
  • 一个.net加密壳的挖矿木马分析
     样本md5:02B886B7B245F7CA52172F299D279A0F   问题:挖矿木马有时候可以启动,有时候起不来?WHY?逆向看看,结论:foreach(Processprocess3inProcess.GetProcesses()){if(process3.ProcessName.ToLower()=="taskmgr"||p......
  • 揭秘深层神经网络:探索残差网络(ResNet)架构
    在现代深度学习中,深层神经网络在解决复杂任务方面表现出色。然而,随着网络层数增加,深层网络往往面临梯度消失和退化问题。残差网络(ResNet)作为一种创新的架构,成功地解决了这些问题,在多个计算机视觉任务上取得了显著的成果。本文将深入探讨ResNet的原理、结构以及其在深度学习中的重要......
  • 开源的 .NET 数据库迁移框架FluentMigrator
    简介FluentMigrator是一个开源的数据库迁移框架,可以帮助用户在开发过程中保持数据库的一致性。它提供了一个简洁的FluentAPI,可以让你使用C#写出简洁的迁移脚本。FluentMigrator提供了一系列的API用来创建和管理数据库迁移,并且支持多种不同的数据库系统,包括MySQL、Postg......
  • Asp.net mvc 笔记
    捕捉处理全局异常自定义一个Attribute继承默认的HandleErrorAttributenamespaceEmpowerApiService.Filter{publicclassCustomerErrorAttribute:HandleErrorAttribute{privatestaticNLog.Loggerlogger=NLog.LogManager.GetCurrentClassLogger();......
  • 使用.NET Jieba.NET 的 PosSegmenter 实现中文分词匹配
    ​目录引言1.什么是中文分词2.Jieba.NET简介3.PosSegmenter介绍4.实现中文分词匹配4.1安装Jieba.NET库4.2创建PosSegmenter实例4.3分词和词性标注4.4中文分词匹配5.总结 引言        在自然语言处理领域,中文分词是一个重要且基础的任务。中文文......
  • NET 封装Task库实现几种生产流程控制
    示例1:串行执行14:55:34.081A14:55:35.085B14:55:36.094C示例2:A执行完BC并行,且C执行完继续执行14:55:58.843A14:55:58.875B14:55:58.875C114:55:58.875C2:100示例3:A执行完BC并行14:56:14.682A14:56:15.689C14:56:15.692B示例4:BC并行全部执行完A14:56:33.054B14:5......
  • 如何优雅的使用telnet测试端口连通性
    telnet命令是TELNET协议的用户接口,它支持两种模式:命令模式和会话模式,虽然telnet支持许多命令,但大部分情况下,我们只是使用它查看目标主机是否打开了某端口(默认是23)。其执行结果有两种:端口未打开$telnet101.199.97.6562715Trying101.199.97.65...telnet:connecttoaddres......
  • 【Netty】关于netty的入门问题
    1、netty是什么2、关于netty中的pipeline.addLast(xxxxHandler)这个xxxHandler是ChannelHandlerAdapter的实现类,ChannelHandlerAdapter有好些方法,也很常见,一直有一些问题,这里加了这么多handler,它在执行的时候,是每一个都会经过的吗?发送的时候会经过吗?响应的时候会经过......
  • 千万级数据深分页查询SQL性能优化实践 | 京东云技术团队
    一、系统介绍和问题描述如何在Mysql中实现上亿数据的遍历查询?先来介绍一下系统主角:关注系统,主要是维护京东用户和业务对象之前的关注关系;并对外提供各种关系查询,比如查询用户的关注商品或店铺列表,查询用户是否关注了某个商品或店铺等。但是最近接到了一个新需求,要求提供查询关注对......