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": "*"

}
相关推荐
玩泥巴的11 小时前
MAF + 飞书:让大模型干活,但别让它乱干
ai·c#·.net·飞书·agent
cpp_w15 小时前
C#基础3- 面向对象中级应用3
后端·c#
步步为营DotNet16 小时前
Async 状态机要搬进运行时了:.NET 10 Runtime Async 实测,快的地方快 1.5 倍,贵的地方贵 5 倍
性能优化·c#·.net·async·runtime
hixiong12316 小时前
C# 使用 ZXingCpp.Angle 进行条码、二维码识别
开发语言·c#·扫码
步步为营DotNet16 小时前
System.Text.Json 源生成:三个“看起来已经生效“的静默失效
c#·.net·native aot·源生成
我不会起名字3221 天前
MySQL 深分页 LIMIT 1000000 卡死:3 种改写与 4 组实测对比
mysql·性能优化·索引·分页·limit
用户788477316341 天前
用 C# 把每周 6 小时的 PDF 录入干到 20 分钟:一份可复制的桌面 OCR 方案
c#
csdn_aspnet1 天前
C# .NetCore Swagger ISchemaFilter 处理枚举、特殊类型
c#·.netcore·swagger
滴滴答答哒1 天前
C# 技巧:优雅实现对象的“局部更新”与“字段合并”
开发语言·c#
code_long2 天前
.net core 连接打印机 使用zpl指令打印机,并且位图本地渲染zpl指令
c#·.netcore·位图·打印机·模板编辑·模板预览