C#/Entity Frame Core 使用Linq 進行分頁 .Skip() .Take() 的使用方法
阿新 • • 發佈:2018-11-01
一般使用格式為
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 initem1) { 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; }
當然,上面的例子,只是簡單地截取了一頁,並返回一個物件。未對資料進行任何處理。
如果你要,一次性獲取資料後,對資料分頁用一個分頁後的列表,這是很麻煩的。
把資料假設為一維,分頁後的資料相當於二維。
有時也不一定需要一下子檢視所有的列表,當資料要分成成白上千時,而使用者只看了一頁~~~~~。
------------
本人是剛剛入門地菜鳥,水平有限,懇請批評。