2011-05-22 15 views
28

Al usar la función Dapper's Query(), estoy intentando completar una clase que tiene una propiedad que es un valor enumerado. En mi base de datos, esta columna se almacena como un byte. Sin embargo, en la clase, son una enumeración. En el enfoque de ADO.NET de edad, me convierto en el bucle lector:Uso de Dapper para llenar las propiedades de Enum

myClass.myEnum = (MyEnumType) reader.GetByte(2); 

Al utilizar Dapper, no puedo encontrar la manera de hacer esta conversión. Por ejemplo, cuando hago algo así como

myClass = conn.Query<MyClassType>("SELECT ... ") 

consigo un error del tipo

Error parsing column 2 (myEnum=1 - Byte) 

¿Hay una manera de utilizar la consulta de Dapper() para rellenar en una clase que contiene propiedades que son tipos de enumeración ?

Gracias.

+0

Tenga en cuenta que si el tipo de datos en SQLITE es "INT", entonces no se requiere ningún código especial para persistir y recuperar enums de .NET desde Sqlite usando Dapper. – BrokeMyLegBiking

Respuesta

36

Claro - el tiempo que su enumeración de acuerdo, es decir,

enum MyEnumType : byte { 
    Foo, Bar, Blip, ... 
} 

entonces todo funcionará automáticamente.

(esta limitación es por diseño, y compartieron con LINQ a SQL como sucede)

Alternativamente, si la enumeración es : int y no puede ser cambiado, lo echó en el SQL:

SELECT ..., CAST(x.myEnum as int) as myEnum, ... 

O, por último, utilice la API dynamic:

foreach(var row in conn.Query(...)) { // note no <T> 
    T obj = new Item { /* copy from row */ }; 
    ... 
} 

la primera es m y objeto preferido, ya que eso impone la limitación del tipo de datos byte en todo su código, lo que es IMO algo bueno.

+1

¡Eso funcionó! No sabía que el tipo de almacenamiento en memoria marcaba una gran diferencia. ¡Gracias! – Slaggg

+21

Cuidado, esto puede ser peligroso si no establece explícitamente los valores para sus enumeraciones. Desea hacer enum MyEnumType: byte {Foo = 1, Bar = 2, Blip = 3, ...} Si no, un desarrollador junior vendrá detrás de usted e insertará Biz entre Foo & Bar y redefinirá los valores de cualquier cosa después de Biz . Esos valores de base de datos ahora son incorrectos. – xanadont

+0

Esto tiene mucho sentido, pero es un poco desafortunado con respecto a SQLite, que informa todos los números enteros como números de 64 bits (lo que significa que todos 'enum's tienen que heredar' long' incluso si solo tienen un puñado de valores). Supongo que eso es más una limitación de SQLite que Dapper :-) – Cameron

Cuestiones relacionadas