Dapper怎么在F#项目中使用 Dapper与F#集成指南

来源:这里教程网 时间:2026-02-21 17:33:47 作者:

Dapper 在 F# 项目中用起来很顺,关键是要适配 F# 的不可变数据和类型推导特性,而不是照搬 C# 写法。 它本身是 .NET 库,不区分语言,但 F# 的惯用写法会让代码更简洁、更安全。

1. 基础设置:引用与连接字符串

在 F# 项目(如

.fsproj
)中添加 Dapper 包:

用 Paket:运行
paket add Dapper
用 dotnet CLI:运行
dotnet add package Dapper

连接字符串建议放在配置中(如

appsettings.json
),用
Microsoft.Extensions.Configuration
读取。F# 中可这样轻量封装:

let connectionString = 
    ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .Build()
        .GetConnectionString("Default")

2. 查询结果映射:优先用记录(Record)而非类

F# 记录天然支持不可变、结构相等、自动属性推导,比手动写 POCO 类更自然。Dapper 能直接映射到记录类型:

type User = { Id: int; Name: string; Email: string }
<p>// 查询返回序列(注意:Dapper 返回的是 IEnumerable<'T>,F# 中常用 seq<'T>)
let getUsers (conn: IDbConnection) : seq<User> =
conn.Query<User>"SELECT Id, Name, Email FROM Users"

注意点:

字段名必须与 SQL 列名(或别名)**完全匹配(大小写敏感)**,否则为默认值 若列名是驼峰(如
user_name
),可用 SQL 别名对齐:
SELECT user_name AS Name FROM ...
避免用匿名类型(C# 风格),F# 中更推荐明确定义记录类型,利于类型安全和重构

3. 参数传递:用匿名对象或 SqlMapper.IDynamicParameters

F# 不支持 C# 那种内联匿名对象语法(

new { Id = 123 }
),但有几种干净方案:

推荐:用
SqlMapper.IDynamicParameters
+
DynamicParameters
(来自 Dapper)
open Dapper
<p>let getUserById (conn: IDbConnection) (id: int) : User option =
let params = DynamicParameters()
params.Add("@Id", id, DbType.Int32) |> ignore
match conn.QuerySingleOrDefault<User>"SELECT * FROM Users WHERE Id = @Id" params with
| null -> None
| u -> Some u
也可用 F# 映射表(
Map<string obj></string>
),但 Dapper 不原生支持;需转成
IDictionary<string obj></string>
才能用 —— 不如
DynamicParameters
直观

4. 异步操作:用
QueryAsync
系列 +
Async.AwaitTask

Dapper 提供异步方法(如

QueryAsync
),F# 中应配合
async
工作流使用:

let getUsersAsync (conn: IDbConnection) : Async<seq<User>> =
    async {
        let! result = conn.QueryAsync<User>"SELECT * FROM Users" |> Async.AwaitTask
        return result
    }

注意:

不要用
Async.StartAsTask
包装同步方法来“假装异步”
确保数据库连接本身支持异步(如
SqlConnection
启用
Async=true
在连接字符串里)

基本上就这些。Dapper 和 F# 配合得挺默契 —— 不需要额外适配层,只要理解它如何靠反射绑定字段,再用好记录类型和

DynamicParameters
,就能写出既简洁又健壮的数据访问代码。

相关推荐