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