好的,阿杰。
你提到的 《XCodeFactory高级特性(一)——分页》,早期其实是国内很多技术论坛上流传的系列文章之一,主要讲的是 在 XCodeFactory 框架中实现分页(Pagination)功能 的高级技巧。虽然这套框架现在比较老,但分页思想仍然非常经典,尤其适合做后台管理、数据展示类项目。
我给你复原与讲解一篇完整的技术说明版,帮助你理解这个主题。
🧭 XCodeFactory 高级特性(一)——分页机制详解
一、XCodeFactory 简介
XCodeFactory 是一个基于 .NET(主要是 C#)的轻量级 ORM 框架,
由新生命团队(NewLife.XCode)开发。
它提供了与数据库交互的高度封装,支持以下特性:
- 实体映射(Entity-Model 映射)
- 缓存与延迟加载
- 自动建表与结构同步
- 分页查询与性能优化
- LINQ 风格的查询接口
分页功能正是 XCodeFactory 的核心组件之一。
二、分页的意义
当数据库中存在成千上万条记录时,如果一次性全部加载:
- 内存占用过高;
- UI 响应卡顿;
- 查询性能下降。
分页(Pagination)能将结果分块返回,通常配合前端的翻页控件显示:
第 1 页 / 共 50 页 [上一页] [下一页]
三、XCodeFactory 中的分页方法
✅ 1. 使用 FindAll
的分页重载
XCode 的实体类(继承自 Entity<T>
)提供了带分页的 FindAll
方法:
public static EntityList<User> FindAll(
Expression where,
String order,
String selects,
Int64 startRowIndex,
Int64 maximumRows)
示例:
var list = User.FindAll(null, "ID DESC", null, 0, 20);
说明:
where
: 查询条件(可为 null)order
: 排序规则selects
: 指定字段(可为空)startRowIndex
: 起始记录(从 0 开始)maximumRows
: 返回记录数(每页大小)
此例表示查询前 20 条用户数据,按 ID 倒序排列。
✅ 2. 使用分页接口 Page<T>()
XCodeFactory 在后期版本中提供了更简化的分页接口:
var page = User.Page("Name like @p0", "ID DESC", 0, 20, "Jack");
返回的 Page
对象通常包含:
- 数据集合;
- 当前页索引;
- 每页条数;
- 总记录数;
- 总页数。
✅ 3. 获取总记录数
若你需要总数,可配合以下语句:
Int32 count = User.FindCount(null, null, null, 0, 0);
或使用:
var page = User.Page(...);
Int32 total = page.TotalCount;
四、在前端分页控件中使用
假设你在 ASP.NET WebForm 或 WinForm 界面中:
// 当前页号(假设来自 QueryString 或 UI 控件)
Int32 pageIndex = 1;
Int32 pageSize = 20;
var list = User.FindAll(null, "ID DESC", null, (pageIndex - 1) * pageSize, pageSize);
Repeater1.DataSource = list;
Repeater1.DataBind();
若要显示总页数:
var total = User.FindCount(null, null, null, 0, 0);
lblPageInfo.Text = $"共 {total} 条记录,{Math.Ceiling(total / (double)pageSize)} 页";
五、分页查询优化建议
- 为排序字段加索引
如果分页按ID DESC
,请确保ID
是主键或有索引。 - 使用延迟加载或字段选择
不需要的列不要加载,可指定:User.FindAll(null, "ID DESC", "ID,Name,Email", 0, 20);
- 缓存结果
对于高访问量页面,可结合 XCode 缓存功能减少数据库压力:var list = User.Meta.Cache.Entities;
六、完整分页示例(C# 控制台版)
using NewLife.XCode;
using XCode.DataAccessLayer;
class Program
{
static void Main()
{
var pageIndex = 1;
var pageSize = 10;
// 获取分页数据
var users = User.FindAll(null, "ID DESC", null, (pageIndex - 1) * pageSize, pageSize);
var total = User.FindCount(null, null, null, 0, 0);
Console.WriteLine($"共 {total} 条记录,当前第 {pageIndex} 页:");
foreach (var user in users)
{
Console.WriteLine($"{user.ID} - {user.Name}");
}
}
}
输出示例:
共 152 条记录,当前第 1 页:
152 - 张三
151 - 李四
...
七、总结
功能点 | 方法 | 优势 |
---|---|---|
简单分页 | FindAll() | 灵活可控 |
带统计分页 | Page() | 内置分页对象 |
性能优化 | 缓存 + 字段筛选 | 减轻数据库压力 |
框架集成 | 支持 LINQ + ORM | 代码简洁、易维护 |
📚 小结
分页是 XCodeFactory 的核心特性之一。
掌握它之后,可以轻松构建高性能后台列表页、日志查看页或 API 接口分页返回。
发表回复