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
相关产品推荐
相关产品推荐

