2012-02-17 48 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,正確兌現時有值。