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

Dapper QuerySingle返回DapperRow类型,如何提取值为数组?

解决Dapper QuerySingle返回DapperRow的取值问题

嘿,别纠结啦,我来给你捋清楚这个事儿!你看到的DapperRow其实是Dapper专门封装的动态类型,它本质上实现了IDictionary<string, object>接口——也就是说它确实是键值对结构,只是你没找对打开方式而已😉

下面给你几种直接拿到你想要的数组的方案:

方案1:直接访问动态属性(最简单,适合已知字段名的情况)

因为返回的是dynamic类型,你可以直接通过字段名点出对应的值,然后把它们放进数组里就行:

using (IDbConnection cnn = new SqlConnection(GetConnectionString())) 
{
    var result = cnn.QuerySingle(sql, parameters);
    // 直接通过动态属性获取值,按你想要的顺序组装数组
    var targetValues = new[] { result.Tcode, result.Hashedpw, result.Salt };
    return targetValues;
}

方案2:转成字典提取值(适合通用场景或不知道字段名的情况)

既然DapperRow实现了字典接口,咱们可以把它强转成IDictionary<string, object>,然后直接提取所有值,或者按指定键取值:

using (IDbConnection cnn = new SqlConnection(GetConnectionString())) 
{
    var result = cnn.QuerySingle(sql, parameters);
    // 强转成字典
    var rowDictionary = (IDictionary<string, object>)result;
    
    // 如果只要所有值(注意顺序和SQL返回的字段顺序一致)
    var allValues = rowDictionary.Values.ToArray();
    
    // 如果需要严格按你指定的顺序取(更稳妥)
    var targetValues = new[] 
    {
        rowDictionary["Tcode"], 
        rowDictionary["Hashedpw"], 
        rowDictionary["Salt"]
    };
    
    return targetValues;
}

方案3:用强类型实体(更安全,推荐长期用)

如果这个查询是固定的,不如定义一个对应的实体类,让Dapper直接返回强类型对象,这样就不用跟动态类型打交道了:

// 先定义实体类
public class UserAuthInfo
{
    public string Tcode { get; set; }
    public string Hashedpw { get; set; }
    public string Salt { get; set; }
}

// 然后在方法里用泛型版本的QuerySingle
using (IDbConnection cnn = new SqlConnection(GetConnectionString())) 
{
    var result = cnn.QuerySingle<UserAuthInfo>(sql, parameters);
    var targetValues = new[] { result.Tcode, result.Hashedpw, result.Salt };
    return targetValues;
}

这样处理后,你就能轻松得到['eeeee', 'NF886jMDl5imyMj0ThDIxA==','Z+HHq6Rt60FPnAf80Lg4Dg==']这样的结果啦!

内容的提问来源于stack exchange,提问作者coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:17:54