2012-02-17 90 views
2

我的SQLite数据库中有一个可为空的双列。更改Dapper,以便将数据库空值映射为double.NaN

从数据库读取数据时(对于double类型的列),我想将空值转换为“double.NaN”。

当前,dapper将空值设置为0,这是我不想要的。

我有什么选择?

  1. 修改Dapper源代码。
  2. 不能使用Dapper,需要用老式的方式编写我自己的ADO.NET代码?
  3. 改变我调用cnn.Query方法的方式,修改映射发生的方式。

我的第一选择是选项1,但我需要帮助修改Dapper。

+1

Dapper不支持'Nullable ''吗? – 2012-02-17 22:05:16

+0

@Anthony,yes和dapper适用于Nullable ,很不幸,这不适合我。我有一个使用double的大型应用程序,有时会将该值设置为double.NaN。 – BrokeMyLegBiking 2012-02-17 23:08:28

+1

我有点不安特殊外壳double和float ...修改短小精悍的将是你去一个COALESCE(NULL,...)将是另一种选择最安全的方式,和。不要以为你需要下降到这个 – 2012-02-19 23:21:15

回答

6

就我个人而言,我会提出反对; null与NaN并不完全相同。如果你真的想这样做,你必须看看GetTypeDeserializer。执行此操作的代码是使用ILGenerator动态生成的,并且相当复杂。如果你找一个行:

il.MarkLabel(isDbNullLabel); // incoming stack: [target][target][value] 

这是哪里的代码分支,如果检测到DbNull来。它目前所做的只是从堆栈中弹出两个值(值和目标),将它们放在地板上,然后继续。您需要检查float/double作为特殊情况,应用您的转换,然后将NaN分配给成员。

但我重复我的说法,这根本不是一个有效的事情。一个更简单的选项将是:

public double? Value {get;set;} 

这需要零变化,并将工作。如果你真的希望它视为不可为空双,也许:

private double foo = double.NaN; 
public double Foo { get { return foo; } set { foo = value; } } 

它将会默认为NaN,正确兑现时有值。