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

2019年12月9日 2254点热度 0人点赞 0条评论
内容纲要

一般使用格式为

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

当然,上面的例子,只是简单地截取了一页,并返回一个对象。未对数据进行任何处理。

如果你要,一次性获取数据后,对数据分页用一个分页后的列表,这是很麻烦的。

把数据假设为一维,分页后的数据相当于二维。

有时也不一定需要一下子查看所有的列表,当数据要分成成白上千时,而用户只看了一页~


本人是刚刚入门地菜鸟,水平有限,恳请批评。

痴者工良

高级程序员劝退师

文章评论