Nanorm.Sqlite 0.1.2
dotnet add package Nanorm.Sqlite --version 0.1.2
NuGet\Install-Package Nanorm.Sqlite -Version 0.1.2
<PackageReference Include="Nanorm.Sqlite" Version="0.1.2" />
paket add Nanorm.Sqlite --version 0.1.2
#r "nuget: Nanorm.Sqlite, 0.1.2"
// Install Nanorm.Sqlite as a Cake Addin #addin nuget:?package=Nanorm.Sqlite&version=0.1.2 // Install Nanorm.Sqlite as a Cake Tool #tool nuget:?package=Nanorm.Sqlite&version=0.1.2
Nanorm
一个针对 ADO.NET 的小型数据访问辅助库。适合裁剪和 Native 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 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已计算。 |
-
net6.0
- Microsoft.Data.Sqlite (>= 6.0.25)
- Nanorm (>= 0.1.2)
-
net7.0
- Microsoft.Data.Sqlite (>= 7.0.14)
- Nanorm (>= 0.1.2)
-
net8.0
- Microsoft.Data.Sqlite (>= 8.0.0)
- Nanorm (>= 0.1.2)
NuGet 包
此包未用于任何 NuGet 包。
GitHub 仓库
此包未使用任何流行的 GitHub 仓库。