C#公共类
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
3.4 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;
namespace Common.Helper.Page
{
/// <summary>
/// 分页帮助类
/// </summary>
public class PageHelper
{
/*
* 1.分页 list.Skip(x).Take(y);
* 2.(x,y)超过(0,list.Count)范围时list为空[],在范围内(或单边超过范围)时显示范围内数据
*/
/// <summary>
/// 分页
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="list">数据</param>
/// <param name="page">页码</param>
/// <param name="size">数据量/页</param>
/// <returns></returns>
public static Data Pagination<T>(List<T> 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);
}
/// <summary>
/// 该分页方法适用于sql server 2008 .net core 3.1不支持2008数据库
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="db"></param>
/// <param name="dbTable"></param>
/// <param name="page"></param>
/// <param name="size"></param>
/// <returns></returns>
public static Data Pagination<T>(DbContext db, DbSet<T> 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());
}
/// <summary>
/// 该方法适用于sql server 2008以上的数据库 sql server 2008会报错
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="page"></param>
/// <param name="size"></param>
/// <returns></returns>
public static Data Pagination<T>(IEnumerable<T> 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());
}
}
/// <summary>
/// 数据页数
/// </summary>
public class Data
{
/// <summary>
/// 总数
/// </summary>
public int? Total { get; set; }
/// <summary>
/// 当前页码
/// </summary>
public int? Current { get; set; }
/// <summary>
/// 数据
/// </summary>
public object List { get; set; }
/// <summary>
/// 入参
/// </summary>
/// <param name="total"></param>
/// <param name="current"></param>
/// <param name="list"></param>
public Data(int? total, int? current, object list)
{
Total = total ?? 0;
Current = current;
List = list;
}
}
}