如何使用Dapper FluentMap将PostgreSQL UUID解析为C#字符串?
处理带空格列+UUID返回的函数与FluentMap映射方案
嘿,我之前也碰到过类似的场景,用PostgreSQL自定义函数返回带空格的列和UUID,还要用FluentMap做映射,给你梳理下完整的处理步骤:
首先先把你没写完的函数补全成可运行的版本(方便后续测试):
CREATE FUNCTION fnSearchInvoices ( _SearchTerm TEXT ) RETURNS TABLE( store_id INTEGER, customer_id TEXT, "Customer Name" TEXT, "Store Name" TEXT, "Email" TEXT, invoice_id UUID ) AS $$ SELECT I.store_id, I.customer_id, C.name AS "Customer Name", S.name AS "Store Name", C.email AS "Email", I.invoice_id FROM invoices I JOIN customers C ON I.customer_id = C.id JOIN stores S ON I.store_id = S.id -- 简单的模糊搜索逻辑,你可以根据实际需求调整 WHERE C.name LIKE '%' || _SearchTerm || '%' OR S.name LIKE '%' || _SearchTerm || '%' $$ LANGUAGE sql;
接下来是FluentMap的映射部分,核心就是把C#实体类的驼峰字段和数据库里带空格/下划线的列一一对应上,UUID类型直接用Guid就行,Dapper和Npgsql会自动处理转换:
第一步:定义实体类
先建一个和函数返回结构对应的实体,字段用常规的C#驼峰命名就好:
public class InvoiceSearchResult { public int StoreId { get; set; } public string CustomerId { get; set; } public string CustomerName { get; set; } public string StoreName { get; set; } public string Email { get; set; } public Guid InvoiceId { get; set; } // 用Guid对应PG的UUID类型 }
第二步:配置FluentMap映射
创建映射类,重点处理带空格的列名,UUID的invoice_id因为没有空格,直接映射就行:
public class InvoiceSearchResultMap : EntityMap<InvoiceSearchResult> { public InvoiceSearchResultMap() { // 下划线列直接映射 Map(x => x.StoreId).ToColumn("store_id"); Map(x => x.CustomerId).ToColumn("customer_id"); // 带空格的列要严格对应函数里的列名(包括大小写,PG是区分大小写的) Map(x => x.CustomerName).ToColumn("Customer Name"); Map(x => x.StoreName).ToColumn("Store Name"); Map(x => x.Email).ToColumn("Email"); // UUID列直接映射,不需要额外处理转换 Map(x => x.InvoiceId).ToColumn("invoice_id"); } }
第三步:注册映射并执行查询
在项目初始化的地方(比如Startup.cs或者全局初始化方法)注册这个映射,然后就可以正常查询了:
// 注册FluentMap映射,只需要执行一次 FluentMapper.Initialize(config => { config.AddMap(new InvoiceSearchResultMap()); }); // 调用函数查询的示例 using (var conn = new NpgsqlConnection("你的PG数据库连接字符串")) { var searchKeyword = "Smith"; var invoices = conn.Query<InvoiceSearchResult>( "SELECT * FROM fnSearchInvoices(@SearchTerm)", new { SearchTerm = searchKeyword } ).ToList(); // 这里就可以直接用invoices里的实体对象了 }
几个要注意的小细节
- 确保你已经安装了必要的NuGet包:
Dapper、Dapper.FluentMap和Npgsql(PG的.NET驱动) - PG里带空格的列名必须用双引号包裹,函数定义里的写法是对的,映射的时候也要严格对应列名的大小写
- 如果遇到UUID转换异常,可以检查下Npgsql的版本,新版本默认已经支持Guid和UUID的双向转换,不需要额外写类型处理器
内容的提问来源于stack exchange,提问作者Joe M
相关产品推荐
相关产品推荐

