C#/Entity Frame Core 使用Linq 進行分頁 .Skip() .Take() 的使用方法


一般使用格式為

int pagesize  = 分頁大小(每一頁大小)
int pageindex = 第幾頁(一般這個變量是隨循環遞增的)
使用方法
.Skip(pagesize*pageindex).Take(pagesize)

.Skip()   忽略數,表示從哪里開始分頁

.Take()  表示每一頁截取多少個記錄

注意 ,數列是從0開始的,也就是說,第一個是 0,第二個是 1 ... ...

以上方法結合,截取的只是一頁,需要在循環中使用,不斷截取下一頁

例如

{1,2,3,4,5,6,7,8,9,10}
.Skip(5).Take(4) //忽略5個數,即從第(5+1)個數開始截!共截取4個
輸出 6,7,8,9

再來看看另一個例子

  

            List<string> Name = new List<string> {
                "張三1","李四2","王朝3","馬漢4","張龍5", "趙虎6","王喜7","是誰8","盧小魚9", "哈哈10","殺敵數11"
            };
            var item1 = Name.Skip(5).Take(4);
            foreach (var i in item1)
            {
                Console.WriteLine(i);
            }
輸出
趙虎6
王喜7
是誰8
盧小魚9

 

Skip(5),不是指從第 5 個開始截,而是指 忽略前面的 5 個

這樣理解了吧?

但是,前面的例子,只能截取一段區間的內容,不算分頁。下面給出簡單的分頁例子。

在C# 控制台中的寫法(為了便於理解,請復制到你的VS中運行測試)

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> Name = new List<string> {   //數據
                "張三1","李四2","王朝3","馬漢4","張龍5", "趙虎6","王喜7","是誰8","盧小魚9", "大俠10","超人11"
            };
            int pagesize = 4;    //每一頁的個數
            for (int i = 0; i * pagesize < Name.Count; i++)   //i 默認值為 0,用 i 表示頁數
            {
                var items = Name.Skip(i * pagesize).Take(pagesize);  //截取第 i 頁
                Console.WriteLine($"第{i + 1}頁");   
                foreach (var item in items)    //輸出每一頁的內容
                {
                    Console.WriteLine("    " + item);   
                }
            }
            Console.ReadKey();
        }

    }
}

 

輸出
第1頁
    張三1
    李四2
    王朝3
    馬漢4
第2頁
    張龍5
    趙虎6
    王喜7
    是誰8
第3頁
    盧小魚9
    哈哈10
    殺敵數11

那么,怎么在 ASP.NET Core/Entity Frame Core 中應用呢?

假設 有一個新聞列表頁面,如下


我的思路是,

每次只截取一頁,用戶點擊第幾頁,就截第幾頁的列表。

這樣省去了循環、算法實現的復雜性。

例子

        /// <summary>
        /// 獲取第 pageIndex 頁的新聞列表
        /// </summary>
        /// <param name="pageSize">每一頁的大小</param>
        /// <param name="pageIndex">第幾頁</param>
        public IEnumerable<News> Test(int pageSize,int pageIndex)
        {
            var NewsLists = _db.News.ToList();  //從數據庫中獲取 News表的數據
            var items = NewsLists.Skip(pageSize * (pageIndex - 1)).Take(pageSize);   //第幾頁的列表
            return items;
        }

當然,上面的例子,只是簡單地截取了一頁,並返回一個對象。未對數據進行任何處理。

如果你要,一次性獲取數據后,對數據分頁用一個分頁后的列表,這是很麻煩的。

把數據假設為一維,分頁后的數據相當於二維。

有時也不一定需要一下子查看所有的列表,當數據要分成成白上千時,而用戶只看了一頁~~~~~。

------------

本人是剛剛入門地菜鳥,水平有限,懇請批評。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM