由于枚举而使用动态时如何访问 Dapper 结果

How to Access Dapper Results When Using Dynamic Due to Enum

我有一个 Dapper 数据库调用,其中有一列映射到该类型的枚举。据我了解,我必须使用动态查询,因为查询无法映射到我的 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'}}

如何访问 IDFooIDStatus?这不起作用:

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

如果我尝试使用实际的 class 而不是动态的:

,这是我得到的错误

System.Data.DataException HResult=0x80131501 Message=Error parsing column 4 (Status=N - String) ArgumentException: Requested value 'N' was not found.

这是枚举。我刚刚添加了 JsonConverter 属性来尝试让它与实际的 Request class.

一起使用
[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 属性 的尝试。

您的问题是 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;
    }
}

运行 我得到...

然后映射请求...

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