2011-05-22 122 views
28

在使用Dapper的Query()函數時,我試圖填充一個具有枚舉值屬性的類。在我的數據庫中,該列存儲爲一個字節。然而,在課堂上,他們是一個枚舉。在舊的ADO.NET的做法,我想讀者循環中轉換:使用Dapper來填充枚舉屬性

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

當使用短小精悍,我無法弄清楚如何做到這一點的轉換。例如,當我這樣做

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

我得到的類型

Error parsing column 2 (myEnum=1 - Byte) 

的錯誤有沒有用短小精悍的Query()來填補,它包含可枚舉類型屬性的類的方式?

謝謝。

+0

請注意,如果SQLITE中的數據類型爲「INT」,則不需要特殊代碼即可使用Dapper從Sqlite持久存取.NET枚舉。 – BrokeMyLegBiking 2012-02-06 21:40:50

回答

36

當然 - 只要你同意枚舉,即

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

然後它會全部自動工作。

(這個限制是由設計,並用共享LINQ到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 */ }; 
    ... 
} 

首先爲m y首選對象,因爲這會強制執行所有代碼中的數據類型限制,這是IMO的一件好事。

+1

這工作!我不知道內存中的存儲類型有什麼不同。謝謝! – Slaggg 2011-05-22 18:09:29

+21

小心,如果您沒有明確設置枚舉的值,這可能會很危險。你想要枚舉MyEnumType:byte {Foo = 1,Bar = 2,Blip = 3,...}如果沒有,一些初級開發者會在你後面插入Biz和Foo&Bar並重新定義Biz之後的值。那些數據庫值現在是錯誤的。 – xanadont 2012-02-24 22:43:54

+0

這非常合理,但對於將所有整數報告爲64位數字(意味着即使只有少數值都必須繼承「long」的所有整數)的SQLite有點不幸。我想這是SQLite比Dapper更多的限制,雖然:-) – Cameron 2014-08-04 21:05:03