全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

Dapper 在 F# 中需适配不可变数据和类型推导:用记录类型映射查询结果,DynamicParameters 传参,Async.AwaitTask 处理异步,字段名须严格匹配且大小写敏感。

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 }

// 查询返回序列(注意:Dapper 返回的是 IEnumerable<'T>,F# 中常用 seq<'T>) let getUsers (conn: IDbConnection) : seq = conn.Query"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

let getUserById (conn: IDbConnection) (id: int) : User option = let params = DynamicParameters() params.Add("@Id", id, DbType.Int32) |> ignore match conn.QuerySingleOrDefault"SELECT * FROM Users WHERE Id = @Id" params with | null -> None | u -> Some u

  • 也可用 F# 映射表(Map),但 Dapper 不原生支持;需转成 IDictionary 才能用 —— 不如 DynamicParameters 直观

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

Dapper 提供异步方法(如 QueryAsync),F# 中应配合 async 工作流使用:

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

注意:

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

基本上就这些。Dapper 和 F# 配合得挺默契 —— 不需要额外适配层,只要理解它如何靠反射绑定字段,再用好记录类型和 DynamicParameters,就能写出既简洁又健壮的数据访问代码。


# js  # json  # app  # ai  # microsoft  # c#  # 数据访问  # .net  # sql  # String  # 封装  # select  # 字符串  # map  # 对象  # 异步  # 数据库  # 重构  # 查询结果  # 的是  # 字段名  # 放在  # 就能  # 不需要  # 工作流  # 会让  # 几种  # 不支持 


相关文章: C++如何编写函数模板?(泛型编程入门)  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何基于云服务器快速搭建网站及云盘系统?  宝塔新建站点报错如何解决?  宝塔新建站点为何无法访问?如何排查?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  网站设计制作企业有哪些,抖音官网主页怎么设置?  XML的“混合内容”是什么 怎么用DTD或XSD定义  定制建站模板如何实现SEO优化与智能系统配置?18字教程  如何快速搭建高效香港服务器网站?  如何用AWS免费套餐快速搭建高效网站?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  如何选择网络建站服务器?高效建站必看指南  北京的网站制作公司有哪些,哪个视频网站最好?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何撰写建站申请书?关键要点有哪些?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  建站之星代理商如何保障技术支持与售后服务?  建站之星图片链接生成指南:自助建站与智能设计教程  制作旅游网站html,怎样注册旅游网站?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  如何在Golang中指定模块版本_使用go.mod控制版本号  如何在IIS中新建站点并解决端口绑定冲突?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  如何确保西部建站助手FTP传输的安全性?  非常酷的网站设计制作软件,酷培ai教育官方网站?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  建站VPS能否同时实现高效与安全翻墙?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  黑客如何通过漏洞一步步攻陷网站服务器?  网站制作报价单模板图片,小松挖机官方网站报价?  建站主机是什么?如何选择适合的建站主机?  宿州网站制作公司兴策,安徽省低保查询网站?  如何构建满足综合性能需求的优质建站方案?  如何通过山东自助建站平台快速注册域名?  淘宝制作网站有哪些,淘宝网官网主页?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  高防服务器:AI智能防御DDoS攻击与数据安全保障  建站VPS选购需注意哪些关键参数?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  建站之星如何修改网站生成路径?  建站上传速度慢?如何优化加速网站加载效率?  如何在香港服务器上快速搭建免备案网站?  建站主机与虚拟主机有何区别?如何选择最优方案?  Swift中swift中的switch 语句  如何通过宝塔面板实现本地网站访问?  如何生成腾讯云建站专用兑换码? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。