好的,阿杰。
你提到的 《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&lt;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)} 页";


五、分页查询优化建议

  1. 为排序字段加索引
    如果分页按 ID DESC,请确保 ID 是主键或有索引。
  2. 使用延迟加载或字段选择
    不需要的列不要加载,可指定: User.FindAll(null, "ID DESC", "ID,Name,Email", 0, 20);
  3. 缓存结果
    对于高访问量页面,可结合 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 接口分页返回。