从Dapper查询返回的DapperRow对象数组中提取DateAndTimeOfObservation字段值的方法
解决DapperRow字段取值的问题
嘿,我来帮你搞定这个Dapper返回的DapperRow对象取值的问题!你之前尝试的两种写法都有小问题,我给你几个靠谱的解决方案:
为什么你的代码报错?
- 第一种写法
oMessageData[4].['DateAndTimeOfObservation']语法错误,多了个多余的点,正确的动态访问不需要点加方括号,直接用.或者方括号但不要前置点。 - 第二种写法
oMessageData[4].values[5]行不通,因为DapperRow并没有名为values的公开属性,所以找不到这个成员。
正确的取值方法
方法1:用动态类型(dynamic)直接访问
DapperRow实现了动态类型接口,所以你可以把数组元素转成dynamic,然后直接通过字段名访问:
dynamic targetRow = oMessageData[4]; var dateValue = targetRow.DateAndTimeOfObservation; // 或者用方括号形式 var dateValueAlt = targetRow["DateAndTimeOfObservation"];
这种方式最简单,适合临时取值,但缺点是没有编译时类型检查,字段名写错了要到运行时才会发现。
方法2:转换为IDictionary<string, object>取值
DapperRow本质上可以被强制转换为字典,这样你就能通过键名获取对应的值:
var rowAsDict = (IDictionary<string, object>)oMessageData[4]; if (rowAsDict.ContainsKey("DateAndTimeOfObservation")) { var dateValue = rowAsDict["DateAndTimeOfObservation"]; // 可以进一步转换为DateTime类型 var dateTime = Convert.ToDateTime(dateValue); }
这种方式更安全,还能先判断键是否存在,避免键不存在的异常。
方法3:映射到强类型对象(推荐)
如果这个数据结构是你经常要处理的,最推荐的方式是定义一个对应的实体类,让Dapper直接把查询结果映射成这个类的集合,这样不仅取值方便,还能获得类型安全和智能提示:
// 先定义实体类 public class ObservationRecord { public string SetId { get; set; } public string ValueType { get; set; } public string ObservationIdentifier { get; set; } public string ObservationValue { get; set; } public string ObservationResultStatus { get; set; } public DateTime DateAndTimeOfObservation { get; set; } } // 查询的时候指定类型 var oMessageData = connection.Query<ObservationRecord>("你的SQL查询语句").ToList(); // 取值就非常直观了 var dateValue = oMessageData[4].DateAndTimeOfObservation;
这种方式是最规范的,尤其在大型项目中,能避免很多动态类型带来的潜在问题。
内容的提问来源于stack exchange,提问作者sapter
相关产品推荐
相关产品推荐

