.net - 更改 Dapper,以便将数据库空值映射到 double.NaN

标签 .net sqlite ado.net dapper

我的 SQLite 数据库中有一个可为空的双列。

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

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

我有什么选择?

  1. 修改 Dapper 源代码。
  2. 无法使用 Dapper,需要以老式方式编写自己的 ADO.NET 代码吗?
  3. 更改调用 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/

相关文章:

.Net DateTime 到 DOS 日期 32 位转换

.net - 需要创建一个也保存类型的动态 ConfigurationSection

c# - 帮助我决定是使用 ASP.NET 默认成员资格/角色提供程序还是编写自定义提供程序

c# - SQLite PCL 数据库插入花费太多时间

ruby-on-rails - 取 postgres 和 sqlite3 中 bool 列的平均值

c# - SQL Server - 传递带有计算列的表值参数

sql - 如果查询有两个更新语句,ExecuteNonQuery() 将返回什么?

c# - 不支持 MongoDB 序列化 ()

JAVA MVC 访问数据库

c# - 不存在从对象类型 System.Int32[] 到已知托管提供程序 native 类型的映射