一般使用格式為
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; }
當然,上面的例子,只是簡單地截取了一頁,並返回一個對象。未對數據進行任何處理。
如果你要,一次性獲取數據后,對數據分頁用一個分頁后的列表,這是很麻煩的。
把數據假設為一維,分頁后的數據相當於二維。
有時也不一定需要一下子查看所有的列表,當數據要分成成白上千時,而用戶只看了一頁~~~~~。
------------
本人是剛剛入門地菜鳥,水平有限,懇請批評。