#c# #enums #dapper
#c# #перечисления #dapper
Вопрос:
При использовании функции Dapper Query() я пытаюсь заполнить класс, у которого есть свойство, представляющее собой перечисляемое значение. В моей базе данных этот столбец хранится в виде байта. Однако в классе они являются перечислением. В старом ADO.NET подход, я бы преобразовал во время цикла чтения:
myClass.myEnum = (MyEnumType) reader.GetByte(2);
При использовании Dapper я не могу понять, как выполнить это преобразование. Например, когда я делаю что-то вроде
myClass = conn.Query<MyClassType>("SELECT ... ")
Я получаю ошибку типа
Error parsing column 2 (myEnum=1 - Byte)
Есть ли способ использовать запрос Dapper () для заполнения класса, который содержит свойства, являющиеся перечисляемыми типами?
Комментарии:
1. Обратите внимание, что если тип данных в SQLITE равен «INT», то для сохранения и извлечения перечислений .NET из Sqlite с использованием Dapper не требуется специального кода.NET.
Ответ №1:
Конечно — до тех пор, пока ваше перечисление согласуется, т.Е.
enum MyEnumType : byte {
Foo, Bar, Blip, ...
}
затем все это будет работать автоматически.
(это ограничение разработано специально и используется совместно с LINQ-to-SQL по мере необходимости)
В качестве альтернативы, если перечисление является : int
и не может быть изменено, приведите его в SQL:
SELECT ..., CAST(x.myEnum as int) as myEnum, ...
Или, наконец, используйте dynamic
API:
foreach(var row in conn.Query(...)) { // note no <T>
T obj = new Item { /* copy from row */ };
...
}
Первый — мой предпочтительный объект, поскольку он обеспечивает соблюдение byte
ограничения типа данных во всем вашем коде, что, по-моему, хорошо.
Комментарии:
1. Это сработало! Я не знал, что тип хранилища в памяти имеет такое значение. Спасибо!
2. Осторожно, это может быть опасно, если вы явно не задаете значения для своих перечислений. Вы хотите выполнить перечисление MyEnumType : byte { Foo = 1, Bar = 2, Blip = 3, … } Если нет, какой-нибудь младший разработчик подойдет к вам сзади и вставит Biz между Foo amp; Bar и переопределит значения чего-либо после Biz. Эти значения базы данных теперь неверны.
3. Это имеет смысл, но немного неудачно в отношении SQLite, который сообщает все целые числа как 64-разрядные числа (что означает, что все
enum
s должны наследоватьсяlong
, даже если у них всего несколько значений). Я думаю, что это скорее ограничение SQLite, чем Dapper, хотя 🙂4. @Cameron github.com/StackExchange/dapper-dot-net/commit /…
5. @Cameron насколько я могу судить, практически все теперь четко сопоставляется практически со всем