史上最強.NET數據分頁方法(文末送視頻資料)

来源:https://www.cnblogs.com/digital-college/archive/2023/08/23/17652562.html
-Advertisement-
Play Games

【前言】 本文講述的.NET數據分頁方法為【史上最強】,已被多家大型科技公司實戰採用 & 也被圈內多家知名IT培訓機構轉載收藏。 【正文】 支持.Net Core(2.0及以上)與.Net Framework(4.5及以上) 可以部署在Docker, Windows, Linux, Mac。 數據分 ...


【前言】

本文講述的.NET數據分頁方法為【史上最強】,已被多家大型科技公司實戰採用 & 也被圈內多家知名IT培訓機構轉載收藏。

 

【正文】

支持.Net Core(2.0及以上)與.Net Framework(4.5及以上)

可以部署在Docker, Windows, Linux, Mac。

數據分頁,幾乎是任何應用系統的必備功能。但當數據量較大時,分頁操作的效率就會變得很低。大數據量分頁時,一個操作耗時5秒、10秒、甚至更長時間都是有可能的,但這在用戶使用的角度是不可接受的……

 

數據分頁往往有三種常用方案。

第一種,把資料庫中存放的相關數據,全部讀入代碼/記憶體,再由代碼對其進行分頁操作。

第二種,直接在資料庫中對相關數據進行分頁操作,再把分頁後的數據輸出給代碼程式。

第三種,先把資料庫中的相關數據全部讀入“緩存”,再由代碼程式對“緩存”中的數據進行讀取+分頁操作。

 

本文下麵重點闡述第一種與第二種兩個解決方案,它們也都是直接基於“資料庫”的。

(第三種方案雖然速度較快,但由於需要用到“緩存”這類第三方工具,且在有數據更改時需要較複雜的“資料庫-緩存”同步操作,故本文暫不詳述。)

 

◆◆第一種方案如下◆◆

從NuGet引入DeveloperSharp包,然後像如下那樣使用分頁功能:

using DeveloperSharp.Extension;
--------------------------

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>>對象內包含的屬性的詳細說明如下:

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 --當前頁碼

以上,即是全網最簡單的“分頁”方法。此方法不僅簡單,還有兩大額外好處。

其一是:方法返回對象中,已自動包含了“分頁”後後續操作所需的全部相關數據(見上述8個),不需再做額外計算處理。

其二是:此方法已自動處理過傳入“頁序號”為負數、或、大於總頁數、等等意外情況,穩定性極高。 

 

◆◆第二種方案如下◆◆

為了演示“第二種分頁方案”如何使用,我們首先在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)
用途:分頁功能(有主鍵)
參數:(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)     當你需要分頁的數據表有“主鍵”欄位時,使用“分頁功能(有主鍵)”。反之,使用“分頁功能(無主鍵)”。

(2)     RecordSet是你需要分頁的“數據總集”的SQL語句。該SQL語句的形式豐富多樣,可以帶條件、排序、甚至還能是多表的聯合查詢、等。

(上述的這第二種分頁方案,引為經典,已被多家大型科技公司採用,還曾被知乎、CSDN推薦到相關技術主題的首頁。但美中不足是:此方案現在僅僅只支持SqlServer資料庫!!)

運行有問題,需要技術支持?以及bug提交通道,請添加微信:894988403

運行有問題,需要技術支持?以及bug提交通道,請添加微信:894988403

 

在技術越來越捲的今天,如果沒點真水平,很難立足下去。為了答謝各位兄弟們的長期關註,特限時免費推出三套熱門技術視頻資源:

資源1:高薪熱門【WPF上位機+工業互聯網】從零手寫實戰

回覆wpf免費領取

資源2:C#+Halcon機器視覺零基礎實戰教程
回覆halcon免費領取

資源3:.Net7 CLR+JIT+MSIL頂級技術視頻教程免費分享
回覆dotnet免費領取

掃描下方二維碼關註公眾號(或搜索:eyuan365)。後臺回覆獲取上述資源。

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文已收錄至GitHub,推薦閱讀 👉 [Java隨想錄](https://github.com/ZhengShuHai/JavaRecord) 微信公眾號:Java隨想錄 > 原創不易,註重版權。轉載請註明原作者和原文鏈接 [TOC] 前面我們講了可達性分析和根節點枚舉,介紹完了GC的前置工作, ...
  • LibCurl是一個開源的免費的多協議數據傳輸開源庫,該框架具備跨平臺性,開源免費,並提供了包括`HTTP`、`FTP`、`SMTP`、`POP3`等協議的功能,使用`libcurl`可以方便地進行網路數據傳輸操作,如發送`HTTP`請求、下載文件、發送電子郵件等。它被廣泛應用於各種網路應用開發中,... ...
  • 我們在`jupyter notebook`中使用`pandas`顯示`DataFrame`的數據時,由於屏幕大小,或者數據量大小的原因,常常會覺得顯示出來的表格不是特別符合預期。 這時,就需要調整`pandas`顯示`DataFrame`的方式。`pandas`為我們提供了很多調整顯示方式的參數,具 ...
  • 事務管理,一個被說爛的也被看爛的話題,還是八股文中的基礎股之一。​本文會從設計角度,一步步的剖析 Spring 事務管理的設計思路(都會設計事務管理器了,還能玩不轉?) ...
  • # 前言 不知道大家有沒有發現,設計模式學習起來其實不容易,並不是說它難,主要是它表達的是思想層面或者說抽象層面的東西,如果你沒有實踐經歷過,感覺就是看了就懂,過了就忘。 所以本人現在也不多花費時間去專門學習設計模式,而是平時在看一些框架源碼時,多留意,多學習別人的設計方法和實現思路,在平時工作中, ...
  • ## 一、前言 一個後端介面大致分為四個部分組成:**介面地址(url)、介面請求方式(get、post等)、請求數據(request)、響應數據(response)**。雖然說後端介面的編寫並沒有統一規範要求,而且如何構建這幾個部分每個公司要求都不同,沒有什麼“一定是最好的”標準,但其中最重要的關 ...
  • # 1. 回顧 ``` 1. springboot框架。簡化spring項目的初始化搭建和配置的。 2. springboot的配置文件種類: (1)properties (2)yml application 3. java讀取springboot配置文件中的內容。 4. springboot註冊w ...
  • 前言 筆者之前在公司搭建過一套生產管理系統,該系統要求能和硬體進行串口通信,同時又要提供後臺信息查詢。筆者給出的解決方案就是:MAUI + Blazor,這樣只需要提供一套UI,就能滿足桌面端、移動端和Web端三種不同應用場景。今天要介紹的就是桌面端的開發實現。 開發技術 .NET 6 + MAUI ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...