Как получить доступ к превосходным результатам при использовании Dynami c благодаря Enum - PullRequest
1 голос
/ 12 февраля 2020

У меня есть вызов 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.

enter image description here

1 Ответ

2 голосов
/ 12 февраля 2020

Ваша проблема в том, что 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;
    }
}

Запуск Я получаю ...

enter image description here

Затем сопоставленный запрос ...

enter image description here

Это то, что моя таблица базы данных выглядит как ...

enter image description here

...