WingWell.Util.Database 8.0.0

WingWell.Util.Database

轻量级 ORM 框架,基于 XML 映射,提供实体 CRUD、条件查询、批量操作、事务、原生 SQL 等数据库访问能力。仅支持 SQL Server。

功能一览

模块 说明
实体基类 PersistentObject 单对象 Insert / Retrieve / Update / Delete
条件查询 RetrieveCriteria<T> 条件筛选、排序、分页,返回列表/DataTable/游标
批量更新 UpdateCriteria<T> 按条件批量 SET 字段
批量删除 DeleteCriteria<T> 按条件批量删除
事务 Transaction 支持跨数据源事务
原生 SQL DataAccess 复杂 JOIN / 聚合 / 分页查询
参数化 Parameter 防 SQL 注入的参数传递

快速开始

dotnet add package WingWell.Util.Database -s https://nuget.wingwell.cloud/v3/index.json

定义实体

继承 PersistentObject,属性名须与 XML ORMapping 配置中的 attribute name 一致:

using WingWell.Util.Database;

public class User : PersistentObject
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public bool IsActive { get; set; }
    public DateTime CreateTime { get; set; }
}

单对象 CRUD

// 新增(自增主键自动回填)
var user = new User { UserName = "Tom", Email = "tom.liu@wingwell.cn" };
user.Insert();

// 按主键查询
var user = new User { UserId = 1 };
bool found = user.Retrieve();  // true = 查到,false = 不存在

// 更新(对象须已 Retrieve 或 Insert 过)
user.UserName = "NewName";
user.Update();

// 删除
user.Delete();

条件查询 — RetrieveCriteria<T>

var criteria = new RetrieveCriteria<User>();
criteria.AddEqualTo("IsActive", true);
criteria.AddMatch("UserName", "Tom");             // LIKE '%Tom%'
criteria.AddMatchPrefix("Email", "tom");          // LIKE 'tom%'
criteria.AddGreaterThan("CreateTime", "2024-01-01");
criteria.OrderBy("CreateTime", FieldOrderBy.Descending);

List<User> users = criteria.GetCollection();      // 实体列表
DataTable dt = criteria.GetDataTable();           // DataTable
User first = criteria.GetFirstObject();           // 第一条
PersistenceCursor<User> cursor = criteria.GetCursor(); // 游标遍历

过滤方法一览

attributeName 是实体属性名(如 UserName),不是数据库列名(如 user_name),框架通过 XML 自动映射。

方法 SQL 等价
AddEqualTo(attr, value) = value
AddNotEqualTo(attr, value) <> value
AddGreaterThan(attr, value) > value
AddGreaterThanOrEqualTo(attr, value) >= value
AddLessThan(attr, value) < value
AddLessThanOrEqualTo(attr, value) <= value
AddEqualNull(attr) IS NULL
AddNotEqualNull(attr) IS NOT NULL
AddMatch(attr, value) LIKE '%value%'
AddNotMatch(attr, value) NOT LIKE '%value%'
AddMatchPrefix(attr, value) LIKE 'value%'
AddIn(attr, values) IN (...)
AddBetween(attr, v1, v2) BETWEEN v1 AND v2
AddFieldCompare(attr1, attr2, op) 列与列比较
AddCustomerCompare(sql, params) 自定义 SQL 片段

value 支持类型:string bool short int long double decimal float

批量更新 — UpdateCriteria<T>

var criteria = new UpdateCriteria<User>();
criteria.AddEqualTo("IsActive", true);                 // WHERE
criteria.AddAttributeForUpdate("UserName", "NewName");  // SET
int affected = criteria.Execute();

批量删除 — DeleteCriteria<T>

var criteria = new DeleteCriteria<User>();
criteria.AddEqualTo("IsActive", false);
int affected = criteria.Execute();

事务

所有 CRUD 和 Criteria 方法都支持 Transaction 重载:

var ts = new Transaction();
try
{
    ts.BeginTransaction();

    var user = new User { UserName = "Tom" };
    user.Insert(ts);

    var criteria = new UpdateCriteria<User>();
    criteria.AddEqualTo("UserId", user.UserId);
    criteria.AddAttributeForUpdate("IsActive", true);
    criteria.Execute(ts);

    ts.CommitTransaction();
}
catch
{
    ts.RollbackTransaction();
    throw;
}

跨数据源事务:

ts.BeginTransaction(new List<string> { "db1", "db2" });

原生 SQL — DataAccess

复杂 JOIN / 聚合等 Criteria 无法满足时使用:

// 查询 → DataTable
DataTable dt = DataAccess.ExecuteQuery("dbName",
    "SELECT * FROM Users WHERE Age > @Age",
    new Parameter("Age", 18));

// 执行 → 受影响行数
int rows = DataAccess.Execute("dbName",
    "UPDATE Users SET IsActive = 0 WHERE LastLogin < @Date",
    new Parameter("Date", "2023-01-01"));

// 行数统计
int count = DataAccess.RowCount("dbName",
    "SELECT * FROM Users WHERE IsActive = 1");

// 分页(pageIndex 从 0 开始)
DataTable page = DataAccess.ExecutePageQuery("dbName",
    "SELECT * FROM Users WHERE IsActive = 1",
    pageIndex: 0, pageSize: 20,
    new KeySorterValue("CreateTime", Sorter.DESC));

所有方法均支持 Transaction 重载:

DataTable dt = DataAccess.ExecuteQuery("dbName", sql, parameters, transaction, timeout);

参数化查询

使用 Parameter 类传参,框架自动加 @ 前缀,防止 SQL 注入:

new Parameter("ParamName", value)
new List<Parameter> { new("Name", "Tom"), new("Age", 18) }

注意事项

要点 说明
属性名 vs 列名 Criteria 中使用实体属性名,框架通过 XML 自动映射到数据库列名
IsPersistent Insert 后自动为 true;手动构造对象直接 Update 需先 Retrieve
自增主键 XML 中 increment="true" 的字段 Insert 时自动排除并回填
数据库支持 仅支持 SQL Server
参数化防注入 原生 SQL 务必用 Parameter 传参,禁止拼接
DataAccess 使用场景 仅用于复杂 JOIN 和大批量操作,单表 CRUD 必须用 Criteria 体系

No packages depend on WingWell.Util.Database.

Version Downloads Last updated
8.0.0 5 03/27/2026
7.0.0 1,347 09/05/2025
5.0.0 2,800 08/29/2024