经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.NET集成DeveloperSharp实现"高效分页"&"无主键分页"
来源:cnblogs  作者:高级梦想家  时间:2024/6/3 9:27:06  对本文有异议

DeveloperSharp系列近期又被制造业ERP、民航飞行App、建筑BIM、电力掌上营业厅、等多家大型采用,站在巨人的肩膀上你能走的更远。

支持.Net Core2.0及以上,支持.Net Framework4.0及以上

数据分页,几乎是任何应用系统的必备功能。但当数据量较大时,分页操作的效率就会变得很低。大数据量分页时,一个操作耗时5秒、10秒、甚至更长时间都是有可能的,但这在用户使用的角度是不可接受的……

 

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

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

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

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

 

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

(第三种方案虽然速度较快,但由于需要用到“缓存”这类第三方工具,且在有数据更改时需要较复杂的“数据库-缓存”同步操作,故本文暂不详述。)

 

◆◆第一种方案如下◆◆

从NuGet引入DeveloperSharp包,然后像如下那样使用分页功能:

  1. using DeveloperSharp.Extension;
  2. --------------------------
  3.  
  4. 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>>对象内包含的属性的详细说明如下:

  1. DataList
  2. 声明:public IEnumerable<T> DataList;
  3. 用途:IEnumerable<T> --当前页的数据
  4. PageSize
  5. 声明:public int PageSize;
  6. 用途:int --页面大小
  7. TotalPageNumber
  8. 声明:public int TotalPageNumber;
  9. 用途:int --总页数
  10. TotalRecordNumber
  11. 声明:public int TotalRecordNumber;
  12. 用途:int --记录总数
  13. CurrentStartIndex
  14. 声明:public int CurrentStartIndex;
  15. 用途:int --当前页的记录起始编号
  16. CurrentEndIndex
  17. 声明:public int CurrentEndIndex;
  18. 用途:int --当前页的记录结束编号
  19. CurrentPageSize
  20. 声明:public int CurrentPageSize;
  21. 用途:int --当前页的记录数量
  22. CurrentPageIndex
  23. 声明:public int CurrentPageIndex;
  24. 用途:int --当前页码

以上,即是全网最简单的“分页”方法。此方法不仅简单,还有两大额外好处。

其一是:方法返回对象中,已自动包含了“分页”后后续操作所需的全部相关数据(见上述8个),不需再做额外计算处理。

其二是:此方法已自动处理过传入“页序号”为负数、或、大于总页数、等等意外情况,可安心使用。

 

◆◆第二种方案如下(包含“无主键分页”)◆◆

为了演示“第二种分页方案”如何使用,我们首先在Visual Studio中新建一个控制台工程。然后,我们做如下三个操作。

【第一步】:从NuGet引用DeveloperSharp包。

【第二步】:创建一个用来与数据库进行通信的“数据源类”(文本示例为:TestData.cs),内容如下:

  1. using DeveloperSharp.Structure.Model;//DataSource的命名空间
  2. using DeveloperSharp.Framework.QueryEngine;//DatabaseType的命名空间
  3.  
  4. namespace YZZ
  5. {
  6. [DataSource(DatabaseType.SQLServer, "Server=localhost;Database=Test;Uid=sa;Pwd=123")]
  7. public class TestData : DeveloperSharp.Structure.Model.DataLayer
  8. {
  9. //类中没有任何代码
  10. }
  11. }

说 明 :“数据源类”(文本示例为:TestData.cs)必 须 继 承 自 DeveloperSharp.Structure.Model.DataLayer 类 , 并 且 在 其 上 设 置DataSource属 性 的 初 始 化 值 为“数据库类型”及其“链接字符串”。

 

【第三步】:为控制台应用类,添加通过“数据源类”(TestData)调用其PagePartition方法进行数据分页的代码。注 意:核心代码就一行而已!!

代码如下:

  1. using DeveloperSharp.Extension;//Table扩展所在的命名空间(.NET6/VS2022用户,则需要在.csproj文件中的<ItemGroup>下添加<Using>标签)
  2. -----------------------------
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. TestData td = new TestData();
  8. //分页
  9. var pp = td.PagePartition("select top 5000 * from t_Order where Id>10 order by Id desc", 20, 162);
  10. List<Product> Products = pp.Table.ToList<Product>();//若没有定义Product类,也可以使用dynamic替代
  11. foreach (var P in Products)
  12. {
  13. Console.WriteLine(P.Name);
  14. }
  15. Console.ReadLine();
  16. }
  17. }

Product类代码如下:

  1. //此实体类中的Id、Name、Quantity、ExpireTime、Model属性名,要与数据表中的Id、Name、Quantity、ExpireTime、Model字段名对应
  2. public class Product
  3. {
  4. public string Id { get; set; }
  5. public string Name { get; set; }
  6. public int? Quantity { get; set; }//数据库中该字段若存在Null值,类型后需要加问号?
  7. public DateTime? ExpireTime { get; set; }
  8. public model? Model { get; set; }//也可以使用枚举,会自动转换
  9. }
  10. public enum model
  11. {
  12. Junior=1,
  13. Middle=2,
  14. Senior=3
  15. }

 

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

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

注意:

(1)     当你需要分页的数据表有“主键”字段时,使用“分页功能(有主键)”。反之,使用“分页功能(无主键)”。

(2)     RecordSet是你需要分页的“数据总集”的SQL语句。该SQL语句的形式丰富多样,可以带条件、排序、甚至还能是多表的联合查询、等。
(该方案目前只能在Sql Server下执行,后续会扩展到其它数据库...)


关注下方公众号,可以获得名企内推。向大佬学习,探行业内幕,享时代机遇。

原文链接:https://www.cnblogs.com/digital-college/p/18227982

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号