Nanorm.Npgsql 0.1.2
dotnet add package Nanorm.Npgsql --version 0.1.2
NuGet\Install-Package Nanorm.Npgsql -Version 0.1.2
<PackageReference Include="Nanorm.Npgsql" Version="0.1.2" />
paket add Nanorm.Npgsql --version 0.1.2
#r "nuget: Nanorm.Npgsql, 0.1.2"
// Install Nanorm.Npgsql as a Cake Addin #addin nuget:?package=Nanorm.Npgsql&version=0.1.2 // Install Nanorm.Npgsql as a Cake Tool #tool nuget:?package=Nanorm.Npgsql&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 在简单的插入 & return 操作中的性能比较,包括执行时间和内存分配。
方法 | 平均值 | 错误 | 标准差 | 比率 | 比率标准差 | 分配的 | 分配比率 |
---|---|---|---|---|---|---|---|
AdoNet | 401.7 us | 3.83 us | 3.58 us | 1.00 | 0.00 | 2.49 KB | 1.00 |
AdoNetDbCommon | 417.6 us | 8.33 us | 7.79 us | 1.04 | 0.03 | 4.18 KB | 1.68 |
Dapper | 400.7 us | 4.57 us | 4.28 us | 1.00 | 0.01 | 3.19 KB | 1.28 |
DapperAot | 409.2 us | 5.80 us | 5.43 us | 1.02 | 0.01 | 3.27 KB | 1.32 |
NanormDbParameters | 402.7 us | 5.47 us | 5.12 us | 1.00 | 0.02 | 2.65 KB | 1.07 |
NanormStringInterpolation | 403.5 us | 5.75 us | 5.38 us | 1.00 | 0.02 | 2.68 KB | 1.08 |
NanormDbCommonParameters | 404.0 us | 5.48 us | 5.12 us | 1.01 | 0.01 | 2.86 KB | 1.15 |
NanormDbCommonStringInterpolation | 406.8 us | 3.60 us | 3.19 us | 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已计算。 |
NuGet包
该包没有被任何NuGet包使用。
GitHub仓库 (1)
显示最热门的1个依赖Nanorm.Npgsql的GitHub仓库
仓库 | 星标 |
---|---|
aspnet/Benchmarks
ASP.NET Core基准测试
|