2011-05-22 4 views
28

Lorsque j'utilise la fonction Query() de Dapper, j'essaie de remplir une classe qui possède une propriété qui est une valeur énumérée. Dans ma base de données, cette colonne est stockée sous forme d'octet. Cependant, dans la classe, ils sont une énumération. Dans l'ancienne approche ADO.NET, je convertir au cours de la boucle de lecteur:Utilisation de Dapper pour remplir les propriétés Enum

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

Lorsque vous utilisez Dapper, je ne peux pas comprendre comment faire cette conversion. Par exemple, quand je fais quelque chose comme

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

Je reçois une erreur du type

Error parsing column 2 (myEnum=1 - Byte) 

Y at-il un moyen d'utiliser la requête de Dapper() pour remplir une classe qui contient des propriétés qui sont des types ENUM ?

Merci.

+0

Notez que si le type de données dans SQLITE est "INT", aucun code spécial n'est requis pour persister et récupérer des enumérations .NET à partir de Sqlite en utilisant Dapper. – BrokeMyLegBiking

Répondre

36

Bien sûr - aussi longtemps que votre ENUM est d'accord, à savoir

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

il fonctionnera tout automatiquement.

(cette limitation est de par leur conception, et partagé avec LINQ to SQL comme il arrive)

Par ailleurs, si l'ENUM est : int et ne peut être changé, le jeter dans le SQL:

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

Ou enfin, utilisez l'API dynamic:

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

le premier est m objet préféré, car cela impose la limitation de type de données byte dans tout votre code, ce qui est une bonne chose pour IMO.

+1

Cela a fonctionné! Je ne savais pas que le type de stockage en mémoire faisait une telle différence. Je vous remercie! – Slaggg

+21

Attention, cela peut être dangereux si vous ne définissez pas explicitement les valeurs de vos énumérations. Vous voulez faire enum MyEnumType: byte {Foo = 1, Bar = 2, Blip = 3, ...} Sinon, un développeur junior viendra derrière vous et insérera Biz entre Foo & Bar et redéfinira les valeurs de tout ce qui après Biz . Ces valeurs de base de données sont maintenant erronées. – xanadont

+0

Cela est parfaitement logique, mais est un peu dommage par rapport à SQLite, qui rapporte tous les entiers sous forme de nombres 64 bits (ce qui signifie que tous les 'enum' héritent de' long' même s'ils n'ont qu'une poignée de valeurs). Je suppose que c'est plus une limitation de SQLite que Dapper si :-) – Cameron

Questions connexes