c# - 由于枚举使用动态时如何访问 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 属性的屏幕截图和尝试。
解决方案
你的问题是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;
}
}
跑步我得到...
然后映射的请求...
这就是我的数据库表的样子......
推荐阅读
- powershell - PowerShell 搜索来自 CSV 的文件并输出目录(如果找到)
- java - 为什么使用外键获取数据会向我发送错误?
- javascript - Angular 2/4:将数组值从服务层中的承诺函数分配给组件中的变量
- python - Python / MySQL如何使用变量插入字符串,不断将“TRUE”更改为1
- node.js - NodeJS 脚本在 macOS 上运行良好,但在 Windows 上却不行
- mongodb - 限制MongoDB集合文档内的数组大小
- node.js - 三元运算符的行为不符合预期
- mysql - 具有三个 where 条件的 select 查询速度较慢,但具有三个 where 条件中的任意两个条件的相同查询速度较快
- html - 当有多个图像时,如何仅在单个图像上应用 CSS 动画?
- javascript - 在 node.js 中跨不同路由使用 socket.io