2011-05-22 138 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