У меня есть вызов Dapper DB, в котором есть столбец, который сопоставляется с перечислением типа. Из того, что я понимаю, я должен выполнять запрос с использованием Dynami c, потому что запрос не может быть сопоставлен с моим типом 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;
}
}
Однако я не могу получить доступ ни к одному из свойств динамического c объекта, называемого dynamicRequest
. При отладке я вижу его значение следующим образом:
{{DapperRow, ID = '8', FooID = '12', Status = 'N'}}
Как получить доступ к ID
, или FooID
, или Status
? Это не работает:
dynamicRequest.ID
dynamicRequest[0]
dynamicRequest["ID"]
// and many other tries...
Это ошибка, которую я получаю, если пытаюсь использовать реальный класс вместо динамического c:
System.Data.DataException HResult = 0x80131501 Сообщение = Ошибка анализа столбца 4 (Status = N - String) 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.