更改Dapper,以便將數據庫空值映射到double.NaN

.net ado.net dapper sqlite

我的SQLite數據庫中有一個可以為空的雙列。

從數據庫讀取時(對於double類型的列),我想將空值轉換為“double.NaN”。

目前dapper將空值設置為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;}

這需要零改變,並將在當前工作。如果你真的希望它被視為不可空的雙重,可能:

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

這將默認為NaN ,並在有值時正確實現。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因