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

从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 14:32:36