前言:本系列文章,旨在講述研發一個中大型項目所需要了解的一系列“基本構件”,并提供這些“基本構件”的【最簡單】、【最快速】使用方法!!(并不深究技術原理) 本系列文章适合有初/中級.NET知識的同學閱讀。
相關下載下傳:
DeveloperSharp.dll元件
高效分頁-示例代碼(dp8-Paging.rar)
資料分頁,幾乎是任何應用系統的必備功能。但當資料量較大時,分頁操作的效率就會變得很低。大資料量分頁時,一個操作耗時5秒、10秒、甚至更長時間都是有可能的,但這在使用者使用的角度是不可接受的……
資料分頁往往有三種常用方案。
第一種,把資料庫中存放的相關資料,全部讀入代碼/記憶體,再由代碼對其進行分頁操作。
第二種,直接在資料庫中對相關資料進行分頁操作,再把分頁後的資料輸出給代碼程式。
第三種,先把資料庫中的相關資料全部讀入“緩存”,再由代碼程式對“緩存”中的資料進行讀取+分頁操作。
本文下面重點闡述第一種與第二種兩個解決方案,它們也都是直接基于“資料庫”的。
(第三種方案雖然速度較快,但由于需要用到“緩存”這類第三方工具,且在有資料更改時需要較複雜的“資料庫-緩存”同步操作,故本文暫不詳述。)
◆◆第一種方案如下◆◆
引入DeveloperSharp.dll元件,初始化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 -- 目前頁碼(最小值為1)
傳回: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 -- 目前頁碼(最小值為1)
傳回: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 -- 目前頁碼(最小值為1)
傳回:PagePiece -- 頁片實體
分頁方法的傳回值PagePiece/PagePiece<T>類,包含分頁後的資料集、總頁數、總資料、目前頁碼、等等一系列“分頁”後經常會用到的資料。PagePiece/PagePiece<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 --目前頁碼
Table
聲明:public System.Data.DataTable Table;
用途:System.Data.DataTable--目前頁的資料表
(或者)
DataList
聲明:public List<T> DataList;
用途:List<T>--目前頁的資料
◆◆第二種方案如下◆◆
為了示範“第二種分頁方案”如何使用,我們首先在Visual Studio中建立一個控制台工程。然後,我們做如下三個操作。
【第一步】:為工程引用添加 DeveloperSharp.dll元件。
【第二步】:建立一個用來與資料庫進行通信的“資料源類”(文本示例為: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.Structure.Model;//PagePiece所在的命名空間
using DeveloperSharp.Extension;//Table擴充所在的命名空間
-----------------------------
class Program
{
static void Main(string[] args)
{
TestData td = new TestData();
//分頁
PagePiece pp = td.PagePartition("select top 500000 * 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 --目前頁碼(最小值為1)
傳回:PagePiece --頁片實體
PagePartition
聲明:public PagePiece PagePartition(string RecordSet, int PageSize, int PageIndex)
用途:分頁功能(無主鍵)
參數:(1)string RecordSet -- 需要分頁的記錄集,可以是表、視圖、或者SQL語句
(2)int PageSize --頁面大小
(3)int PageIndex --目前頁碼(最小值為1)
傳回:PagePiece --頁片實體
注意:
(1) 當你需要分頁的資料表有“主鍵”字段時,使用“分頁功能(有主鍵)”。反之,使用“分頁功能(無主鍵)”。
(2) RecordSet是你需要分頁的“資料總集”的SQL語句。該SQL語句的形式豐富多樣,可以帶條件、排序、甚至還能是多表的聯合查詢、等。
【附注】:文章開頭給出的下載下傳示例,均已成功運作通過。但下載下傳示例往往隻包含“核心模闆”内容。有些輔助内容需要自己建立/設定(比如:資料庫建立、連結字元串設定、檔案配置、路徑設定、參數設定、等等...)。
請在了解文章内容的基礎上,再做示例實驗。若遇異常報錯,請仔細閱讀+了解本文。
也随時歡迎聯系作者,微信掃描文末二維碼,擷取更多技術支援!
推薦閱讀
- .NET中大型項目開發必備(1)–UUID全球通用唯一識别碼
- .NET中大型項目開發必備(2)–CORS跨域通路
- .NET中大型項目開發必備(3)–資料庫的負載均衡
- .NET中大型項目開發必備(4)–資料庫的讀寫分離
- .NET中大型項目開發必備(5)–Web服務/WebApi的負載均衡
- .NET中大型項目開發必備(6)–IUtility工具介紹
- .NET中大型項目開發必備(7)–ORM資料庫通路技術
- .NET中大型項目開發必備(8)–高效分頁
- .NET中大型項目開發必備(9)--http請求調用(Post與Get)
- .NET中大型項目開發必備(10)--圖檔的裁剪、縮放、與加水印
- .NET中大型項目開發必備(11)--使用Redis緩存
- .NET中大型項目開發必備(12)--使用MQ消息隊列
如果文章對你有幫助,請點贊、收藏、關注(原創内容,歡迎轉載,轉載請注明出處) 有疑問想擷取專業技術支援?請掃描左側微信二維碼聯系作者 出處:https://www.cnblogs.com/DeveloperSharp/ 本文采用「CC BY 4.0」知識共享協定進行許可,轉載請注明作者及出處。 |