using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;
namespace Common.Helper.Page
{
///
/// 分页帮助类
///
public class PageHelper
{
/*
* 1.分页 list.Skip(x).Take(y);
* 2.(x,y)超过(0,list.Count)范围时list为空[],在范围内(或单边超过范围)时显示范围内数据
*/
///
/// 分页
///
/// 数据类型
/// 数据
/// 页码
/// 数据量/页
///
public static Data Pagination(List list, int page, int size)
{
if (list == null)
return new Data(0, page, null);
if (list.Count != 0 && list.Count >= size)
return new Data(list.Count, page <= 0 ? 0 : page,
list.Skip(Convert.ToInt32((page <= 0 ? 0 : page - 1) * size)).Take(size).ToList());
return new Data(list.Count, page, list);
}
///
/// 该分页方法适用于sql server 2008 .net core 3.1不支持2008数据库
///
///
///
///
///
///
///
public static Data Pagination(DbContext db, DbSet dbTable, int page, int size) where T : class
{
var entityType = db.Model.FindEntityType(typeof(T));
var tableName = entityType.GetTableName();
var primaryKeyName = entityType.FindPrimaryKey().Properties.First().Name;
return new Data(dbTable.Count(), page, dbTable.FromSqlRaw($"select * from (select ROW_NUMBER() OVER(ORDER BY {primaryKeyName}) RowSerialNumber ,* from {tableName}) s where RowSerialNumber BETWEEN {(page - 1) * size + 1} and {page * size}").ToList());
}
///
/// 该方法适用于sql server 2008以上的数据库 sql server 2008会报错
///
///
///
///
///
///
public static Data Pagination(IEnumerable list, int page, int size)
{
return list == null ? new Data(0, page, null) : new Data(list.Count(), page, list.Skip(Convert.ToInt32((page <= 0 ? 0 : page - 1) * size)).Take(size).ToList());
}
}
///
/// 数据页数
///
public class Data
{
///
/// 总数
///
public int? Total { get; set; }
///
/// 当前页码
///
public int? Current { get; set; }
///
/// 数据
///
public object List { get; set; }
///
/// 入参
///
///
///
///
public Data(int? total, int? current, object list)
{
Total = total ?? 0;
Current = current;
List = list;
}
}
}