C#使用linq将数据进行分页

ruoyi.net 的分页帮助类,如下:

csharp 复制代码
public class PageUtils
{
    public static PageDomain GetPageDomain()
    {
        var request = App.HttpContext.Request;
        var pageNum = !string.IsNullOrEmpty(request?.Query["pageNum"]) ? Convert.ToInt32(request?.Query["pageNum"]) : 1;
        var pageSize = !string.IsNullOrEmpty(request?.Query["pageSize"]) ? Convert.ToInt32(request?.Query["pageSize"]) : 10;
        var orderByColumn = request?.Query["orderByColumn"].ToString();
        var isAsc = request?.Query["isAsc"];

        var orderBy = !string.IsNullOrEmpty(orderByColumn) ? $"{orderByColumn.ToUnderScoreCase()} {isAsc}" : "";

        return new PageDomain
        {
            PageNum = pageNum > 0 ? pageNum : 1,
            PageSize = pageSize > 0 ? pageSize : 10,
            OrderByColumn = orderByColumn,
            ////PropertyName = orderByColumn.ToUpperCamelCase(),
            PropertyName = orderByColumn ?? string.Empty,
            OrderBy = orderBy,
            IsAsc = isAsc
        };
    }
}

分页实体类,如下:

csharp 复制代码
/// <summary>
/// 分页泛型集合
/// </summary>
public class SqlSugarPagedList<TEntity>
    where TEntity : new()
{
    /// <summary>
    /// 页码
    /// </summary>
    public int PageIndex { get; set; }

    /// <summary>
    /// 页容量
    /// </summary>
    public int PageSize { get; set; }

    /// <summary>
    /// 总条数
    /// </summary>
    public int Total { get; set; }

    ///// <summary>
    ///// 总页数
    ///// </summary>
    //public int Total { get; set; }

    /// <summary>
    /// 当前页集合
    /// </summary>
    public IEnumerable<TEntity> Rows { get; set; }

    /// <summary>
    /// 消息状态码
    /// </summary>
    public int Code { get; set; }

    /// <summary>
    /// 是否有上一页
    /// </summary>
    public bool HasPrevPages { get; set; }

    /// <summary>
    /// 是否有下一页
    /// </summary>
    public bool HasNextPages { get; set; }
}

数据查询于分页如下:

csharp 复制代码
public async Task<SqlSugarPagedList<DmBedStaffDto>> GetLeaveStaffDtoPagedListAsync(DmBedStaffDto dto)
{
    var pageDomain = PageUtils.GetPageDomain();
    
	// 获取主数据库中的数据
    var bedDtoList = await _dmBedRepository.Repo.Context.Queryable<DmBed>()
        .LeftJoin<DmDorm>((bed, dorm) => bed.Dormid == dorm.Id)
        .Select((bed, dorm) => new DmBedDto
        {
            Id = bed.Id,
            Floorid = dorm.Floorid,
            Dormid = bed.Dormid,
            Dormnum = dorm.Dormnum,
            Floordorm = dorm.Floordorm,
            Bedname = bed.Bedname,
            Bedstatus = bed.Bedstatus,
            Empid = bed.Empid,
        })
        .ToListAsync();

	// 获取从数据库中的数据
    var empIds = bedDtoList.Where(b => !string.IsNullOrEmpty(b.Empid)).Select(b => b.Empid).Distinct().ToList();
    var staffList = _bdStaffRepository.GetStaffByEmpId(empIds);

    // 内存中联查两个集合
    var query = from bed in bedDtoList
                join staff in staffList on bed.Empid equals staff.EMPID
                where staff.ENDFLAG == 1
                select new DmBedStaffDto
                {
                    Id = bed.Id,
                    Floorid = bed.Floorid,
                    Dormid = bed.Dormid,
                    Dormnum = bed.Dormnum,
                    Floordorm = bed.Floordorm,
                    Bedname = bed.Bedname,
                    Bedstatus = bed.Bedstatus,
                    Empid = bed.Empid,
                    Empname = staff.EMPNAME,
                    Sex = staff.SEX,
                    Certno = staff.CERTNO,
                    Age = staff.AGE,
                    Empphone = staff.MOBILE,
                    Linkaddr = staff.LINKADDR,
                    Depid = staff.DEPID,
                    Depcode = staff.DEPCODE,
                    Depname = staff.DEPNAME,
                    Deplevel = staff.DEPLEVEL,
                    Depid_h = staff.DEPID_H,
                    Depcode_h = staff.DEPCODE_H,
                    Depname_h = staff.DEPNAME_H,
                    Companyid = staff.COMPANY_ID,
                    Companycode = staff.COMPANY_CODE,
                    Companyname = staff.COMPANY_NAME,
                    Postid = staff.POSTID,
                    Postcode = staff.POSTCODE,
                    Postname = staff.POSTNAME,
                    Endflag = staff.ENDFLAG,
                    Joineddate = staff.JOINED_DATE,
                    Departdate = staff.DEPART_DATE
                };

	// 内存中分页
    var list = query.OrderBy(x => x.Floorid).ThenBy(x => x.Dormnum).ToPagedList<DmBedStaffDto>(pageDomain.PageNum, pageDomain.PageSize);
    return list;
}

分页扩展类,如下:

csharp 复制代码
/// <summary>
/// 分页拓展
/// </summary>
/// <param name="entity"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public static SqlSugarPagedList<TEntity> ToPagedList<TEntity>(this IEnumerable<TEntity> entity, int pageIndex, int pageSize)
    where TEntity : new()
{
    int totalCount = entity.Count();
    int skip = (pageIndex -1) * pageSize;
    var items = entity.Skip(skip).Take(pageSize);
    var totalPages = (int)Math.Ceiling(totalCount / (double)pageSize);
    return new SqlSugarPagedList<TEntity>
    {
        PageIndex = pageIndex,
        PageSize = pageSize,
        Rows = items,
        Total = (int)totalCount,
        HasNextPages = pageIndex < totalPages,
        HasPrevPages = pageIndex - 1 > 0
    };
}

从数据库需要添加 租户 标记,如下:

csharp 复制代码
[Tenant("slave")] // 从库标记
[SugarTable("IUAP_APDOC_BASEDOC.BO_BD_STAFF")] // Oracle数据库表
public class BDStaff : BaseEntity
{
    public string EMPID { get; set; }
    public string? EMPCODE { get; set; }
    public string? EMPNAME { get; set; }
	// ......
}

appsettings.json 中配置的 sqlsugar 数据库连接字符串如下:

csharp 复制代码
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning",
      "Microsoft.EntityFrameworkCore": "Information"
    }
  },
  "ConnectionConfigs": [
    {
      "ConfigId": "master",
      "ConnectionString": "data source=.;initial catalog=ry_net;persist security info=False;user id=sa;pwd=666888;packet size=4096",
      "DbType": "SqlServer",
      "IsAutoCloseConnection": true
    },
    {
      "ConfigId": "slave",
      "ConnectionString": "Data Source=127.0.0.1:1521/orcl;User ID=yybip;Password=888666",
      "DbType": "Oracle",
      "IsAutoCloseConnection": true
    }
  ],

  "AppSettings": {
    "InjectSpecificationDocument": false
  },

  "Urls": "http://0.0.0.0:7778",
  "AllowedHosts": "*"

}
相关推荐
YuanlongWang16 小时前
c# 泛型的详细介绍
c#
嵌入式学习和实践18 小时前
C# WinForms 多窗口交互通信的示例-主窗口子窗口交互通信
c#·交互·主窗口-子窗口通信
专注VB编程开发20年18 小时前
C#,VB.NET数组去重复,提取键名和重复键和非重复键
c#·.net·linq·取唯一键·去重复·重复数量
YuanlongWang18 小时前
Entity Framework Core和SqlSugar的区别,详细介绍
c#
unicrom_深圳市由你创科技21 小时前
工业上位机,用Python+Qt还是C#+WPF?
python·qt·c#
偶尔的鼠标人1 天前
Avalonia DataGrid 控件的LostFocus事件会多次触发
开发语言·c#
ytttr8731 天前
C# 仿QQ聊天功能实现 (SQL Server数据库)
数据库·oracle·c#
future_studio1 天前
聊聊 Unity(小白专享、C# 小程序 之 图片播放器)
unity·小程序·c#
c#上位机2 天前
wpf中Grid的MouseDown 事件无法触发的原因
c#·wpf
CodeCraft Studio2 天前
国产化PDF处理控件Spire.PDF教程:如何在 C# 中从 HTML 和 PDF 模板生成 PDF
pdf·c#·html·.net·spire.pdf·pdf文档开发·html创建模板pdf