天天看點

.NET中大型項目開發必備(8)--高效分頁

前言:本系列文章,旨在講述研發一個中大型項目所需要了解的一系列“基本構件”,并提供這些“基本構件”的【最簡單】、【最快速】使用方法!!(并不深究技術原理)    本系列文章适合有初/中級.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」知識共享協定進行許可,轉載請注明作者及出處。