Aore.SqlBuilder.Extensions 1.2.3

dotnet add package Aore.SqlBuilder.Extensions --version 1.2.3
                    
NuGet\Install-Package Aore.SqlBuilder.Extensions -Version 1.2.3
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Aore.SqlBuilder.Extensions" Version="1.2.3" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Aore.SqlBuilder.Extensions" Version="1.2.3" />
                    
Directory.Packages.props
<PackageReference Include="Aore.SqlBuilder.Extensions" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Aore.SqlBuilder.Extensions --version 1.2.3
                    
#r "nuget: Aore.SqlBuilder.Extensions, 1.2.3"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Aore.SqlBuilder.Extensions@1.2.3
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Aore.SqlBuilder.Extensions&version=1.2.3
                    
Install as a Cake Addin
#tool nuget:?package=Aore.SqlBuilder.Extensions&version=1.2.3
                    
Install as a Cake Tool

Aore.SqlBuilder.Extensions

Aore.SqlBuilder 的 Dapper 执行层扩展:把核心库构建出的 SqlResult 直接跑起来——参数自动转换为 DynamicParameters(含 Oracle 输出参数)、同步/异步执行、分页查询(自动 Count)、自增主键回读、事务与批量操作。

using Aore.SqlBuilder;
using Aore.SqlBuilder.Extensions;

var db = new SqlExecutor(connection, SqlDialect.MySql);

// 查询:构建器 → SQL → Dapper 执行,一步到位
var page = await db.QueryPageAsync(Sql.Select<User>()
    .Where(u => u.Age >= 18)
    .OrderByDescending(u => u.CreateTime), pageNumber: 1, pageSize: 20);

// 插入并回读自增主键
long id = await db.InsertAsync(newUser, returnId: true);

安装

dotnet add package Aore.SqlBuilder.Extensions

依赖:Aore.SqlBuilder(核心库)+ Dapper。目标框架与核心库一致:netstandard2.0 / net462 / net472 / net48 / net8.0 / net9.0 / net10.0(旧框架自动附带 Microsoft.Bcl.AsyncInterfaces)。

两种使用方式

方式 适合场景
扩展方法(IDbConnection 上的 (this IDbConnection, SqlResult) 重载) 已有构建产物 SqlResult,想精确控制每条语句的执行
SqlExecutor 门面(绑定连接 + 方言的执行器) 业务 CRUD 常规开发,一个对象搞定查询/写入/分页/事务

两者执行链路与安全约定完全一致(参数化命令 + 语句校验),门面内部即委托扩展方法。

方式一 · 扩展方法

查询映射(DapperSqlResultExtensions,作用于 IDbConnection + SqlResult)

var sql = Sql.Select<User>().Where(u => u.Age > 18).ToSql(SqlDialect.MySql);

var users  = connection.Query<User>(sql);                        // 实体列表(可 buffered: false)
var users2 = await connection.QueryAsync<User>(sql);             // 异步列表
var first  = connection.QueryFirstOrDefault<User>(sql);          // 首行,无结果返回 null
var one    = connection.QuerySingle<User>(sql);                  // 单行(0 行或多行抛异常)

// 流式查询:不缓冲结果逐行消费,适合大结果集
// 注意:流式期间连接被占用,消费完成前不可复用该连接执行其他命令
await foreach (var u in connection.QueryUnbufferedAsync<User>(sql, cancellationToken))
{
    Process(u);
}

// 参数对象:一般无需手动转换;需要时可显式取出(输出参数以 DbType.Int64 输出方向绑定)
DynamicParameters p = sql.ToDynamicParameters();

语句执行(SqlResultExecutor,作用于 IDbConnection + SqlResult)

int rows   = connection.Execute(sql);                 // 非查询语句,返回受影响行数
object? v  = connection.ExecuteScalar(sql);           // 首行首列标量
long newId = connection.InsertAndGetId(insertSql);    // INSERT(需 ReturnId())并回读自增主键
// 以上均有 Async 版本(ExecuteAsync / ExecuteScalarAsync / InsertAndGetIdAsync)

InsertAndGetId 的方言处理:Oracle 走 RETURNING id INTO :… 输出参数(封装在参数里,执行后自动读取);其余方言走同批次 SELECT 首行首列。

分页查询(自动 Count)

// 先执行 Count 统计总数,再执行分页语句取当前页,两次查询共用构建器的条件参数
PagedResult<User> page = connection.QueryPage(
    Sql.Select<User>().OrderBy(u => u.Id), SqlDialect.MySql, pageNumber: 2, pageSize: 20);

var asyncPage = await connection.QueryPageAsync(builder, SqlDialect.MySql, 1, 20);

分页信息会写入传入的构建器,请勿跨调用复用同一个构建器实例。

方式二 · SqlExecutor 门面

var db = new SqlExecutor(connection, SqlDialect.MySql);
// 可选传入 SqlOptions 局部配置:new SqlExecutor(connection, dialect, new SqlOptions { … })

执行器级设置

db.Logger = result => Console.WriteLine(result.Sql);  // 每条语句渲染后、执行前回调(可接 ILogger 打印 SQL 与参数)
db.QueryTimeout = 30;                                 // 默认命令超时秒数(方法级 commandTimeout 参数优先)

所有方法的尾参均支持 IDbTransaction? transaction 与 int? commandTimeout。

查询

var list  = db.Query(Sql.Select<User>().Where(u => u.IsActive));              // 实体列表
User? one = db.QueryFirstOrDefault(Sql.Select<User>().Where(u => u.Id == id)); // 首行
var page  = db.QueryPage(Sql.Select<User>().OrderBy(u => u.Id), 1, 20);       // 分页(自动 Count)
long cnt  = db.Count(Sql.Select<User>().Where(u => u.DeptId == 1));           // 统计总数
bool has  = db.Exists(Sql.Select<User>().Where(u => u.UserName == "alice"));  // EXISTS 探测
// 以上均有 Async 版本(QueryAsync / QueryFirstOrDefaultAsync / QueryPageAsync / CountAsync / ExistsAsync)

写入

int rows = db.Execute(statement);                                    // 执行任意 SqlResult(含原生片段产物)
long id  = db.Insert(newUser, returnId: true);                       // 插入并回读自增主键
int cnt  = db.InsertRange(userList);                                 // 批量插入(按参数上限自动分片)
var ids  = db.InsertGetIds(userList);                                // 批量插入回读全部主键
        // (PG/SQL Server 走批量 RETURNING/OUTPUT 一次往返,其余方言逐行插入回读)
int upd  = db.Update(Sql.Update<User>().Set(u => u.Age, 21).Where(u => u.Id == id));
int uby  = db.UpdateBy(user);                                        // 全字段更新 + 主键定位
int ups  = db.Upsert(Sql.Upsert(user).OnKey(u => new { u.Code }));   // Upsert
int del  = db.DeleteByKey(user);                                     // 按主键删除
// 以上均有 Async 版本(InsertAsync / InsertRangeAsync / InsertGetIdsAsync / UpdateAsync / …)

多结果集 / 大表批处理

// 多条语句合并为一次往返,返回 GridReader(用完必须 Dispose)
using (var grid = db.QueryMultiple(new ISqlBuildable[] { usersQuery, ordersQuery }))
{
    var users  = grid.Read<User>().ToList();
    var orders = grid.Read<Order>().ToList();
}

// 大表分页遍历:惰性逐页产出(基于 QueryPage,自动 Count)
foreach (var p in db.IterateAll(Sql.Select<Log>().OrderBy(l => l.Id), pageSize: 1000))
{
    Export(p.Items);
}

// 分批处理:每满一页回调一次
db.Chunk(Sql.Select<Log>().OrderBy(l => l.Id), 1000, page => Export(page.Items));

IterateAll 会逐页改写传入构建器的分页参数,请勿复用该构建器;深翻页场景建议按排序键做 keyset 分页。

事务

using (var tran = connection.BeginTransaction())
{
    var txDb = db.WithTransaction(tran);   // 返回绑定事务的执行器副本
    txDb.Update(deduct);
    txDb.Update(credit);
    tran.Commit();                          // 事务的提交/回滚仍由调用方管理
}

PagedResult<T> 分页结果

成员 说明
Items 当前页数据(IReadOnlyList<T>)
Total 满足条件的总行数
PageNumber / PageSize 当前页码(1 起)/ 页大小
TotalPages 总页数
IsFirst / IsLast 是否首页 / 末页

安全设计

  • 所有命令经参数化命令工厂创建:语句文本仅来源于 SqlResult(构建器生成、标识符经方言转义),绑定前经语句校验(空语句 / NUL 控制字符 / 超 1MB 上限拦截),外部值全部以 IDbDataParameter / DynamicParameters 绑定——不存在字符串拼接用户输入进 SQL 的路径
  • Oracle 输出参数自动封装,ToDynamicParameters 对同一 SqlResult 只构建一次并缓存
  • 方言值规范化(如 Oracle bool → NUMBER 1/0)在参数绑定前自动完成

与核心库的分工

层 包 职责
构建意图 Aore.SqlBuilder 实体/Lambda → SqlResult(构建器、表达式翻译、方言渲染)
执行 Aore.SqlBuilder.Extensions(本包) SqlResult → Dapper 参数转换、执行、分页、回读、事务、批量

更多文档见源码仓库 docs/ 目录(06-Dapper集成、09-使用SOP操作手册、12-方法使用手册等)。

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 is compatible.  net463 was computed.  net47 was computed.  net471 was computed.  net472 is compatible.  net48 is compatible.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.2.3 46 9/24/2026