【朝夕教育】2023年10月 .NET CORE工具案例-DeveloperSharp(高效分页)

本文介绍了如何使用DeveloperSharp库实现数据库分页,包括内存分页和基于数据库的分页策略,以及如何创建数据源类进行高效交互。讨论了分页的性能瓶颈和优化方法,提供示例代码和PagePartition方法的详细说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,优快云博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年优快云博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏


🚀前言

数据库分页是指将大量数据按照一定的规则分成若干页,每页只显示固定数量的数据,以方便用户浏览和管理数据。常见的规则是按照数据的主键或排序字段进行分页,通过控制每页的数据量和当前显示的页码,用户可以在整个数据集中浏览到所需的数据。数据库分页通常用于网站、移动应用程序等数据密集型应用中,以提高用户体验和系统性能。

数据库分页的瓶颈主要有以下几个方面:

  1. 数据库查询性能:分页操作需要进行 LIMIT 和 OFFSET 的查询操作,当数据量较大时,查询效率会显著降低,因此需要优化查询语句或使用索引提高查询效率。

  2. 网络传输性能:当数据量较大时,数据库查询结果需要通过网络传输到前端应用程序,如果网络传输速度慢或带宽较小,则会影响用户体验。

  3. 应用程序性能:大量的分页操作会占用大量的内存和 CPU 资源,可能会导致应用程序的性能下降或者出现崩溃等问题。

  4. 数据库锁定问题:对于高并发的系统,分页操作可能会导致数据库锁定,从而影响其他用户的访问和操作。

因此,在进行数据库分页操作时,需要考虑以上瓶颈问题并进行相应的优化,以保证系统的性能和稳定性。

本文主要介绍DeveloperSharp的使用,DeveloperSharp是一个研发中大型项目必备的系统平台,也是一个低代码平台。

它主要包括了如下一些功能:

  • 基于Sql语句、存储过程、事务、分页的数据库操作。并几乎支持市面上所有种类的数据库。
  • 图片操作。裁剪、缩放、加水印。
  • http请求调用(Post与Get)
  • 高效分页
  • Web服务/WebApi的负载均衡
  • 数据库的负载均衡,以及读写分离
  • CORS跨域访问
  • UUID全球通用唯一识别码
  • MQ消息队列(请另行使用DeveloperSharp.RabbitMQ包)
  • Redis缓存(请另行使用DeveloperSharp.Redis包)
  • “异种数据库”的负载均衡
  • 其他相关功能

🚀一、DeveloperSharp的使用

🔎1.数据库分页方案

数据库分页方案一般有两种:

  1. 使用 LIMIT 和 OFFSET 实现分页

在 SQL 语句中使用 LIMIT 和 OFFSET 子句,可以限制查询结果的数量和偏移量,实现分页效果。例如:

SELECT * FROM table_name LIMIT 10 OFFSET 20

上述语句表示从 table_name 表中获取 10 条记录,并从第 21 条记录开始获取(偏移量为 20),实现第三页的分页效果。这种方案适用于数据量较小的情况,但对于大数据量的查询效率会比较低。

  1. 使用游标(Cursor)实现分页

游标实际上是一个指向查询结果的指针,可以通过向前或向后移动来遍历查询结果。使用游标进行分页,可以避免在数据库中查询大量数据,提高查询效率。例如:

DECLARE @PageSize INT = 10
DECLARE @PageNum INT = 3

DECLARE @StartRow INT = (@PageNum - 1) * @PageSize + 1
DECLARE @EndRow INT = @PageNum * @PageSize

DECLARE @Cursor CURSOR
SET @Cursor = CURSOR SCROLL FOR
    SELECT * FROM table_name ORDER BY id

OPEN @Cursor

FETCH ABSOLUTE @StartRow FROM @Cursor
WHILE @@FETCH_STATUS = 0 AND @@CURSOR_ROWS <= @EndRow
BEGIN
    -- 处理查询结果
    FETCH NEXT FROM @Cursor
END

CLOSE @Cursor
DEALLOCATE @Cursor

上述语句表示查询 table_name 表中第三页(每页 10 条记录),使用游标遍历查询结果。这种方案适用于数据量较大的情况,但对于性能会有一定要求。

🔎2.数据库和代码交互方案

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

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

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

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

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

🦋2.1 基于内存分页

☀️2.1.1 安装包
DeveloperSharp

在这里插入图片描述

☀️2.1.2 使用
using DeveloperSharp.Extension;
--------------------------

var Page1 = DataAll.PagePartition(20, 5);

其中,要被分页的DataAll对象可以是List、IQueryable、IEnumerable、等任何集合类型。

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

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

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 --当前页码

🦋2.2 基于数据库分页

☀️2.2.1 创建数据源类

数据源类主要是用来与数据库进行通信的,必须继承自DeveloperSharp.Structure.Model.DataLayer类 。

using DeveloperSharp.Framework.QueryEngine;
using DeveloperSharp.Structure.Model;

namespace ConsoleTest
{
    //数据源类
    [DataSource(DatabaseType.SQLServer, "Server=localhost;Database=DB_SY_Formal;Uid=sa;Pwd=1")]
    public class TestData : DeveloperSharp.Structure.Model.DataLayer
    {
        //类中没有任何代码
    }
}

在这里插入图片描述

☀️2.2.2 使用
using ConsoleTest;
using DeveloperSharp.Extension;

TestData td = new TestData();

//分页(从第162*20后取20页)
var pp = td.PagePartition("select top 5000 * from MO", 20, 162);

List<dynamic> Products = pp.Table.ToList<dynamic>();
foreach (var P in Products)
{
    Console.WriteLine(P.DOC_NO);
}

Console.ReadLine();

在这里插入图片描述

☀️2.2.3 PagePartition方法说明

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

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

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

🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

在这里插入图片描述

再次感谢您的阅读和支持!

最诚挚的问候, “愚公搬代码”

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值