首页 > 解决方案 > 由于枚举使用动态时如何访问 Dapper 结果

问题描述

我有一个 Dapper DB 调用,它有一列映射到类型上的枚举。据我了解,我必须使用动态查询,因为查询无法映射到我的Request类型,因为Status它是一个枚举。所以我尝试使用这个:

public async Task<Request> GetByRequestId(long id)
{
    string sql = "SELECT * FROM Request WHERE ID = @id";

    using (var connection = new SqlConnection(_connectionString))
    {
        // Need dynamic here because of the conversion of the Status column as an enum.
        // If someone has a better way...
        dynamic dynamicRequest = await connection.QueryFirstOrDefaultAsync(sql, new { id });
        if (dynamicRequest == null) { return default; }

        var request = new Request
        {
            Id = dynamicRequest.ID,
            Status = (RequestStatus)Enum.Parse(typeof(RequestStatus), dynamicRequest.Status)
        };

        return request;
    }
}

但是,我无法访问名为dynamicRequest. 调试时,我可以看到它的值是这样的:

{{DapperRow, ID = '8', FooID = '12', Status = 'N'}}

如何访问ID、 或FooID、 或Status?这不起作用:

dynamicRequest.ID
dynamicRequest[0]
dynamicRequest["ID"]
// and many other tries...

如果我尝试使用实际类而不是动态类,这是我得到的错误:

System.Data.DataException HResult=0x80131501 消息=解析第 4 列时出错(状态=N - 字符串)ArgumentException:未找到请求的值“N”。

这是枚举。我刚刚添加了该JsonConverter属性以尝试使其与实际Request类一起使用。

[JsonConverter(typeof(StringEnumConverter))]
public enum RequestStatus
{
    [EnumMember(Value = "N")]
    New = 1,

    [EnumMember(Value = "A")]
    Approved = 2,

    [EnumMember(Value = "C")]
    Cancelled = 3,

    [EnumMember(Value = "D")]
    Declined = 4,

    [EnumMember(Value = "P")]
    Pending = 5,
}

这是dynamicRequest访问 ID 属性的屏幕截图和尝试。

在此处输入图像描述

标签: c#dynamicdapper

解决方案


你的问题是Enum.Parse不尊重你的EnumMember属性。

然而,这有效。

public static async Task<Request> GetByRequestId(long id)
{
    string sql = "SELECT * FROM Request WHERE ID = @id";

    using (var connection = new SqlConnection(_connectionString))
    {
        // Need dynamic here because of the conversion of the Status column as an enum.
        // If someone has a better way...
        dynamic dynamicRequest = await connection.QueryFirstOrDefaultAsync(sql, new { id });
        if (dynamicRequest == null) { return default; }

        var request = new Request
        {
            Id     = dynamicRequest.ID,
            Status = JsonConvert.DeserializeObject<RequestStatus>($"\"{dynamicRequest.Status}\""),
        };

        return request;
    }
}

跑步我得到...

在此处输入图像描述

然后映射的请求...

在此处输入图像描述

这就是我的数据库表的样子......

在此处输入图像描述


推荐阅读