Nanorm 0.1.2

dotnet add package Nanorm --version 0.1.2                
NuGet\Install-Package Nanorm -Version 0.1.2                
此命令用于在 Visual Studio 的包管理器控制台中运行,因为它使用 NuGet 模块的 Install-Package 版本。
<PackageReference Include="Nanorm" Version="0.1.2" />                
对于支持 PackageReference 的项目,将此 XML 节点复制到项目文件中以引用此代码包。
paket add Nanorm --version 0.1.2                
#r "nuget: Nanorm, 0.1.2"                
#r 指令可用于 F# Interactive 和 Polyglot Notebooks。将此代码复制到交互式工具或脚本的源代码中,以引用此代码包。
// 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 CI NuGet

适用于 ADO.NET 的小型数据访问帮助库。适合裁剪和原生 AOT。

它支持

如何使用

Nanorm 支持 .NET 6+,并特别支持 .NET 7+,这得益于 接口上的静态虚拟成员 和源生成器。

入门

  1. 安装适合您所使用的 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
      
  2. 创建一个 classrecordstruct 来映射数据库查询结果。如果您正在使用 .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"),
            };
    }
    
  3. 创建适当的 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 已计算。
兼容的目标框架
包含的目标框架(在包中)
深入了解关于 目标框架.NET Standard
  • net6.0

    • 无依赖项。
  • net7.0

    • 无依赖项。

NuGet 包 (2)

显示依赖于 Nanorm 的前 2 个 NuGet 包

下载
Nanorm.Npgsql

包描述

Nanorm.Sqlite

包描述

GitHub 存储库

此包未用于任何流行的 GitHub 存储库。

版本 下载 最后更新
0.1.2 267 12/6/2023
0.1.1 166 11/21/2023
0.1.0 125 11/15/2023
0.0.6 390 6/2/2023
0.0.5 122 5/30/2023
0.0.4 126 5/2/2023
0.0.3 156 4/11/2023
0.0.2 158 4/10/2023
0.0.1 151 4/8/2023