2011-05-22 21 views
28

Dapper'ın Query() işlevini kullanırken, numaralandırılmış bir özellik olan bir özelliği olan bir sınıfı doldurmaya çalışıyorum. Veritabanımda, bu sütun bir bayt olarak saklanır. Ancak, sınıfta, bir enum vardır. Eski ADO.NET yaklaşımda, ben okuyucu döngü sırasında dönüştürmek istiyorum: Dapper kullanırken Enum özelliklerini doldurmak için Dapper kullanma

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

, ben bu dönüşümü nasıl yapılacağını bilemiyorum. Mesela ben enum türleri şunlardır özelliklerini içeren bir sınıfta doldurmak için Dapper en Sorgu() kullanmak için bir yolu var mı tip

Error parsing column 2 (myEnum=1 - Byte) 

bir hata alıyorum

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

gibi bir şey yaptığımda ?

Teşekkür ederiz.

+0

SQLIT'deki veri türü "INT" ise, Dapper kullanarak Sqlite kullanarak .NET enumlarını devam ettirmek ve almak için özel bir kod gerekmediğini unutmayın. – BrokeMyLegBiking

cevap

36

Emin - sürece enum kabul eder gibi yani

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

o zaman hepsi otomatik çalışacaktır.

(bu sınırlama tasarım gereğidir ve paylaşılmaz LINQ-SQL gibi olur) enum : int ve değiştirilemez eğer

Alternatif, SQL döküm:

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

birinci m:

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

Ya da son olarak, dynamic API kullanımı y tercih edilen nesne, tüm kodunuz boyunca byte veri türü sınırlamasını zorladığı için IMO iyi bir şeydir.

+1

Bu işe yaradı! Bellek içi depolama türünün böyle bir fark yarattığından habersizdim. Teşekkür ederim! – Slaggg

+21

Dikkatli olun, bu, enumlarınızın değerlerini açıkça belirlemezseniz tehlikeli olabilir. Enum yapmak istediğiniz MyEnumType: byte {Foo = 1, Bar = 2, Blip = 3, ...} Değilse, bazı junior geliştiriciler arkanızdan gelecek ve Biz'i Foo & Bar arasına yerleştirip Biz'den sonra hiçbir şeyin değerini yeniden tanımlayacağız. . Bu veritabanı değerleri artık yanlış. – xanadont

+0

Bu, mükemmel bir anlam ifade eder, ancak SQLite ile ilgili olarak, tüm tam sayıları 64-bit rakamlar olarak bildiren (bu değerlerin tümü bir avuç değere sahip olsa bile "enum'un" uzun süre "miras alması gerektiği anlamına gelen) biraz talihsiz bir durumdur. Sanırım bu Dapper'den daha çok bir SQLite sınırlaması var :-) – Cameron

İlgili konular