1. 程式人生 > >C#/Entity Frame Core 使用Linq 進行分頁 .Skip() .Take() 的使用方法

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;
        }

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

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

把資料假設為一維,分頁後的資料相當於二維。

有時也不一定需要一下子檢視所有的列表,當資料要分成成白上千時,而使用者只看了一頁~~~~~。

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

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