我的 SQLite 数据库中有一个可为空的双列。
从数据库读取时(对于 double 类型的列),我想将 null 转换为“double.NaN”。
目前 dapper 将 null 值设置为 0,这是我不想要的。
我有什么选择?
- 修改 Dapper 源代码。
- 无法使用 Dapper,需要以老式方式编写自己的 ADO.NET 代码吗?
- 更改调用 cnn.Query 方法的方式,以修改映射发生的方式。
我的第一选择是选项 1,但我需要修改 Dapper 的帮助。
最佳答案
就我个人而言,我会建议不要这样做; null 与 NaN 并不完全相同。如果您确实想这样做,则必须查看GetTypeDeserializer
。执行此操作的代码是使用 ILGenerator
动态生成的,并且相当复杂。如果你寻找一行:
il.MarkLabel(isDbNullLabel); // incoming stack: [target][target][value]
这是检测到 DbNull
时代码分支到的位置。它当前所做的只是从堆栈中弹出两个值(值和目标),将它们放在地板上,然后继续。您需要检查 float
/double
作为特殊情况,应用转换,然后将 NaN 分配给成员。
不过,我重申我的主张,这根本不是一件有效的事情。一个更简单的选择是:
public double? Value {get;set;}
这需要零更改,并且当前可以工作。如果您真的希望将其视为不可为空的 double 值,也许:
private double foo = double.NaN;
public double Foo { get { return foo; } set { foo = value; } }
现在默认为 NaN
,并在存在值时正确实现。
关于.net - 更改 Dapper,以便将数据库空值映射到 double.NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9334365/