首页 > 其他分享 >Net下的高效分页工具

Net下的高效分页工具

时间:2022-10-12 09:00:18浏览次数:56  
标签:PagePiece PagePartition 高效 分页 int -- Net public

本文技术方案支持.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类,包含分页后的数据集、总页数、总数据、当前页码、等等一系列“分页”后经常会用到的数据。PagePiece/PagePiece的属性的详细说明如下:

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语句的形式丰富多样,可以带条件、排序、甚至还能是多表的联合查询、等。

标签:PagePiece,PagePartition,高效,分页,int,--,Net,public
From: https://www.cnblogs.com/wml-it/p/16783279.html

相关文章

  • MyBatis中三种分页查询方式
    文章目录通过limit分页查询通过Rowbounds通过分页插件pagehelper通过limit分页查询mapper接口1List<User>getUserByLimit(Map<String,Integer>map);mapper.xm......
  • .Net CLR异常简析
    楔子前面一篇研究了下C++异常的,这篇来看下,CLR的异常内存模型,实际上都是一个模型,承继自windows异常处理机制。不同的是,有VC编译器(vcruntime.dll)接管的部分,被CLR里面的函数......
  • .NET 7 RC 2 发布,倒计时一个月发布正式版
    微软2022-10-12发布了.NET7RC2,下一站是.NET7正式发布,就在下个月NetConf2022(11月8日)期间正式发布。经过长达一年时间的开发,.NET7规划的所有主要的新功能都已推出......
  • CSharp: Chain of Responsibility Pattern in donet core 3
     ///<summary>///责任链模式ChainofResponsibilityPattern亦称:职责链模式、命令链、CoR、ChainofCommand、ChainofResponsibility///geovindu,......
  • 开箱即用~基于.NET Core的统一应用逻辑分层框架设计
    目前公司系统多个应用分层结构各不相同,给运维和未来的开发带来了巨大的成本,分层架构看似很简单,但保证整个研发中心都使用统一的分层架构就不容易了。那么如何保证整个研......
  • 【精品】vue3中setup语法糖下通用的分页插件
    注意:本博客理论基础:https://blog.51cto.com/lianghecai/5743179效果自定义分页插件:PagePlugin.vue<scriptsetuplang="ts">//total:用来传递数据总条数//pageSize......
  • Netty学习之NIO基础
    Netty学习之NIO基础本博客是根据黑马程序员Netty实战学习时所做的笔记可先参考博客JavaNIO一、三大组件简介Channel与BufferJavaNIO系统的核心在于:通道(Channel)和......
  • Golang Kubenetes容器多集群平台开发实践
    前言  Go语言在基础服务开发领域优势     Go语言在高并发、通信交互复杂、重业务逻辑的分布式系统中非常适用,具有开发体验好、一定量级下服务稳定、性能满足需要......
  • WeLink协作文档,高效协同办公的重要选择​
    WeLink协作文档,高效协同办公的重要选择​一直以来,打工人都在追求更高的办公效率,以期达到事半功倍的效果。尤其是新冠疫情期间,不少人的出行和工作都受到了影响,很多上班族被迫......
  • WeLink考勤平台——为企业打造高效的数字化考勤解决方案
    WeLink考勤平台——为企业打造高效的数字化考勤解决方案​华为云WeLink为华为云在数字办公领域的入局打响了漂亮的第一枪。如今,WeLink凭借其强大的核心功能和优质的服务,接......