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; }
当然,上面的例子,只是简单地截取了一页,并返回一个对象。未对数据进行任何处理。
如果你要,一次性获取数据后,对数据分页用一个分页后的列表,这是很麻烦的。
把数据假设为一维,分页后的数据相当于二维。
有时也不一定需要一下子查看所有的列表,当数据要分成成白上千时,而用户只看了一页~~~~~。
------------
本人是刚刚入门地菜鸟,水平有限,恳请批评。
痴者工良(https://whuanle.cn)