Nanorm 0.1.2
dotnet add package Nanorm --version 0.1.2
NuGet\Install-Package Nanorm -Version 0.1.2
<PackageReference Include="Nanorm" Version="0.1.2" />
paket add Nanorm --version 0.1.2
#r "nuget: Nanorm, 0.1.2"
// Install Nanorm as a Cake Addin #addin nuget:?package=Nanorm&version=0.1.2 // Install Nanorm as a Cake Tool #tool nuget:?package=Nanorm&version=0.1.2
Nanorm
适用于 ADO.NET 的小型数据访问帮助库。适合裁剪和原生 AOT。
它支持
- PostgreSQL 通过
Npgsql
- SQLite 通过
Microsoft.Data.SQLite
- 任何 ADO.NET 数据提供程序通过
System.Data.Common
如何使用
Nanorm 支持 .NET 6+,并特别支持 .NET 7+,这得益于 接口上的静态虚拟成员 和源生成器。
入门
安装适合您所使用的 ADO.NET 提供程序(即数据库)的
Nanorm
代码包。在项目目录中使用dotnet
命令行PostgreSQL
dotnet add package Nanorm.Npgsql --prerelease
SQLite
dotnet add package Nanorm.Sqlite --prerelease
所有其他 ADO.NET 提供程序
dotnet add package Nanorm --prerelease
创建一个
class
、record
或struct
来映射数据库查询结果。如果您正在使用 .NET 7 或 .NET 8,可以将其设置为partial
,并用[DataRecordMapper]
属性进行装饰以启用源生成器,该生成器将为您实现IDataRecordMapper<T>
接口。[DataRecordMapper] public partial class Todo { public int Id { get; set; } public required string Title { get; set; } public bool IsComplete { get; set; } } // Generated for you if .NET 7+, otherwise you'll need to write it yourself partial class Todo : IDataRecordMapper<Todo> { public static Todo Map(System.Data.IDataRecord dataRecord) => new() { Id = dataRecord.GetInt32("Id"), Title = dataRecord.GetString("Title"), IsComplete = dataRecord.GetBoolean("IsComplete"), }; }
创建适当的
IDbConnection
实例并使用 Nanorm 扩展方法之一执行查询。QueryAsync
方法返回IAsyncEnumerable
,因此您可以使用await foreach
遍历结果,或者简单地调用ToListAsync()
以异步方式获取List<T>
结果// Using Npgsql to query a local PostgreSQL instance var connectionString = "Server=localhost;Port=5432;Username=postgres;Database=postgres"; await using var db = new NpgsqlDataSourceBuilder(connectionString).Build(); var todos = db.QueryAsync<Todo>("SELECT * FROM Todos"); var todosList = await todos.ToListAsync(); if (todosList.Count == 0) { Console.WriteLine("There are currently no todos!"); } else { Console.WriteLine($"Found {todosList.Count} todo(s):"); foreach (var todo in todosList) { Console.WriteLine($"({todo.Id}) {todo.Title}"); } }
使用参数
Nanorm 支持几种向查询传递参数的方式
传递由 Nanorm 的 自定义字符串插值处理器处理的字符串插值字符串。这是一种首选方法。查询会自动以优化方式参数化,即没有字符串连接,使用池分配等。
var title = "Do the dishes"; var result = db.QueryAsync<Todo>($"SELECT * FROM Todos WHERE Title = {title}")
传递 ADO.NET 供应商的
DbParameter
实现的实例作为参数,例如var title = "Do the dishes"; var sql = "SELECT * FROM Todos WHERE Title = $1"; var result = db.QueryAsync<Todo>(sql, new NpgsqlParameter { Value = title }))
传递一个回调,它修改 ADO.NET 供应商的参数集合实现,例如
var title = "Do the dishes"; var sql = "SELECT * FROM Todos WHERE Title = $1"; var result = db.QueryAsync<Todo>(sql, parameters => parameters.Add(title))
扩展方法
以下扩展方法提供了简化数据库操作的方法
方法 | 描述 |
---|---|
ExecuteAsync |
执行不返回任何结果的命令。 |
ExecuteScalarAsync |
执行命令并返回第一个结果集中的第一行的第一列。忽略所有其他列、行和结果集。 |
QueryAsync |
执行命令并返回一个适当类型的 DbDataReader 。 |
QueryAsync<T> |
执行命令并将映射到 T 实例的行作为 IAsyncEnumerable<T> 返回。 |
QuerySingleAsync<T> |
执行命令并映射返回的第一行到 T 的实例。 |
AsDbParameter |
从 object 值创建供应商特定的参数对象。 |
AsTypedDbParameter<T> |
从 T 值创建泛型参数(仅限 Npgsql) |
ToListAsync<T> |
异步地将 IAsyncEnumerable<T> 转换为 List<T> 。 |
基准测试
Nanorm 旨在作为 ADO.NET 的一层非常薄的层,并支持修剪和本机 AOT。以下是它与原始 ADO.NET 和 Dapper 进行简单的插入和返回操作的处理器的时间消耗和内存分配的比较
方法 | 平均值 | 错误 | 标准差 | 比率 | 比率标准差 | 分配量 | 分配率 |
---|---|---|---|---|---|---|---|
AdoNet | 401.7 微秒 | 3.83 微秒 | 3.58 微秒 | 1.00 | 0.00 | 2.49 KB | 1.00 |
AdoNetDbCommon | 417.6 微秒 | 8.33 微秒 | 7.79 微秒 | 1.04 | 0.03 | 4.18 KB | 1.68 |
Dapper | 400.7 微秒 | 4.57 微秒 | 4.28 微秒 | 1.00 | 0.01 | 3.19 KB | 1.28 |
DapperAot | 409.2 微秒 | 5.80 微秒 | 5.43 微秒 | 1.02 | 0.01 | 3.27 KB | 1.32 |
NanormDbParameters | 402.7 微秒 | 5.47 微秒 | 5.12 微秒 | 1.00 | 0.02 | 2.65 KB | 1.07 |
NanormStringInterpolation | 403.5 微秒 | 5.75 微秒 | 5.38 微秒 | 1.00 | 0.02 | 2.68 KB | 1.08 |
NanormDbCommonParameters | 404.0 微秒 | 5.48 微秒 | 5.12 微秒 | 1.01 | 0.01 | 2.86 KB | 1.15 |
NanormDbCommonStringInterpolation | 406.8 微秒 | 3.60 微秒 | 3.19 微秒 | 1.01 | 0.01 | 3.12 KB | 1.26 |
产品 | 版本 兼容和额外的计算目标框架版本。 |
---|---|
.NET | net6.0 兼容。 net6.0-android 已计算。 net6.0-ios 已计算。 net6.0-maccatalyst 已计算。 net6.0-macos 已计算。 net6.0-tvos 已计算。 net6.0-windows 已计算。 net7.0 兼容。 net7.0-android 已计算。 net7.0-ios 已计算。 net7.0-maccatalyst 已计算。 net7.0-macos 已计算。 net7.0-tvos 已计算。 net7.0-windows 已计算。 net8.0 已计算。 net8.0-android 已计算。 net8.0-browser 已计算。 net8.0-ios 已计算。 net8.0-maccatalyst 已计算。 net8.0-macos 已计算。 net8.0-tvos 已计算。 net8.0-windows 已计算。 |
-
net6.0
- 无依赖项。
-
net7.0
- 无依赖项。
NuGet 包 (2)
显示依赖于 Nanorm 的前 2 个 NuGet 包
包 | 下载 |
---|---|
Nanorm.Npgsql
包描述 |
|
Nanorm.Sqlite
包描述 |
GitHub 存储库
此包未用于任何流行的 GitHub 存储库。