一、应用场景
需要分页查询(并非全表查载入物理内存再筛选),返回列表1和列表2叠加的数据时
二、实现方式
列表1必查,列表2根据列表1的查询结果决定列表2的分页查询参数
三、示意图及其实现代码
1.示意图
黄色代表list1的数据(26)条,绿色代表list2的数据(74条),蓝色代表分页取数据的情况(三种情况:list1 / list1+list2 / list2 )
2.实现代码
public class Program
{
public static void Main()
{
// 示例数据
int list1count = 26; // list1 的总条数
int pageIndex = 1; // 当前页码
int pageSize = 20; // 每页大小
GetPaginationData(list1count, 1, pageSize);
GetPaginationData(list1count, 2, pageSize);
GetPaginationData(list1count, 3, pageSize);
GetPaginationData(list1count, 4, pageSize);
GetPaginationData(list1count, 5, pageSize);
}
/// <summary>
/// 获取第二列表分页参数的方法
/// </summary>
/// <remarks>
/// 该方法用于处理分页查询时,列表一和列表二组合数据返回的场景,
/// 根据列表一的总条数和分页信息,计算并确定列表二的分页参数。
/// </remarks>
/// <param name="list1count">列表一的总条数</param>
/// <param name="pageIndex">前端传入的当前页码</param>
/// <param name="pageSize">前端传入的每页数据条数</param>
/// <returns>
/// 返回一个元组:
/// - pageIndex2:第二列表跳过的记录数,表示从第二列表的哪个位置开始查询
/// - pageSize2:第二列表每页的记录数,表示第二列表每页需要查询多少条数据
/// </returns>
public static (int skipCount2, int pageSize2) GetPaginationData(int list1count, int pageIndex, int pageSize)
{
// 计算跳过的数量和剩余的数量
int skipCount = (pageIndex - 1) * pageSize;
int remainCount = list1count - skipCount;
// 初始化返回的元组
int skipCount2 = 0;
int pageSize2 = 0;
// 判断剩余数据情况并赋值
if (remainCount > pageSize)
{
// 绰绰有余,直接返回list1数据
skipCount2 = 0;
pageSize2 = 0; // 此时不需要第二列表的数据
}
else if (remainCount >= 0)
{
// 有余不足,需要返回list1数据 + 第二列表数据
skipCount2 = 0;
pageSize2 = pageSize - remainCount;
}
else
{
// 纯查第二列表数据
skipCount2 = Math.Abs(remainCount);
pageSize2 = pageSize;
}
// 输出调试信息
Console.WriteLine($"【pageIndex入参】{pageIndex}【skipCount2】{skipCount2},【pageSize】{pageSize2}");
// 返回最终结果
return (skipCount2, pageSize2);
}
}
3.结果
【pageIndex入参】1【skipCount2】0,【pageSize】0
【pageIndex入参】2【skipCount2】0,【pageSize】14
【pageIndex入参】3【skipCount2】14,【pageSize】20
【pageIndex入参】4【skipCount2】34,【pageSize】20
【pageIndex入参】5【skipCount2】54,【pageSize】20