由于枚举而使用动态时如何访问 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'}}
如何访问 ID
、FooID
或 Status
?这不起作用:
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 的样子...
我有一个 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'}}
如何访问 ID
、FooID
或 Status
?这不起作用:
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 的样子...