You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:21:31