2012-01-10 31 views
0

我正在尋找一些關於使用Linq2Sql從存儲過程返回的最佳實踐(考慮內存和CPU時間)的Nullable<T>字段的建議。如何處理從存儲過程返回的Nullable <T>類型?

請考慮以下情形和限制:

  1. 我想避免在代碼中隨處可見使用fieldValue.HasValue檢查。因此,我需要用一些默認值替換所有Nullable<T>與正常的屬性(尤其是DateTime,Double,Int)。
  2. 我期待閱讀約100萬個具有~20個Nullable類型字段的對象。
  3. 內存和CPU使用率是一個重要的考慮因素。
  4. 要求是從一個對象(不是DataRow)中存儲過程的結果,因此使用Linq2Sql。

請分享您的意見或經驗處理類似的情況。

感謝您的關注。

+0

如果該字段爲空,您希望發生什麼? – msarchet 2012-01-10 15:46:19

+0

是LINQ to SQL的核心要求嗎?我所要求的原因是因爲存在開銷,並且最好執行存儲過程或查詢性能/內存原因。 – 2012-01-10 15:47:48

+1

「我需要用一些默認值替換所有......」 - 在這種限制的情況下,在所選的默認值是實際數據的情況下,本質上會改變數據的含義。如果你的數據從不包含那些默認值作爲有效值(這總是有爭議的),爲什麼你首先使用'可空數字'(或者我假設的可空列)? – 2012-01-10 15:47:48

回答

2

最好的解決方案:

  • 不要讓SQL返回NULL值。

  • 最簡單的方法是不允許列自身爲空,但如果這不可能,那麼您可以在查詢中使用ISNULL(field,defaultvalue)來返回數據。

下一個最好的解決方案:

  • 覆蓋的LINQToSQL對象得到調用,以檢查對象的HasValue,然後如果不將它設置爲現場的default(type)值。

沒有辦法不檢查每個值。

1

您可以編寫擴展方法,如:

public static string SafeGetString(this SqlDataReader _Reader, int _ColIndex) 
{ 
    if (_Reader.IsDBNull(_ColIndex)) 
     return null; //Default value 
    else 
     return _Reader.GetString(_ColIndex); 
} 

對於使用的每種類型的(其實有沒有這麼多),設置默認值比null其他的東西,如果你想將數據插入到非 - 可空的類型。

+0

同意。但是,這將是一個性能打擊!考慮迭代超過1M行,20個屬性(20M)調用此方法與空檢查! – 2012-01-10 15:52:38

+2

@Amby不檢查每個值的唯一方法是不允許SQL返回null。 – msarchet 2012-01-10 15:56:31

+0

@Amby +1有效點,或者更好,但不使用存儲過程 – Jonathan 2012-01-10 16:00:59

0

硬核選項是合併這些值的來源。您將保證空值將遠離數據讀取器。

但是,由於性能似乎是一個大問題,我建議您測量不同的選項,以便在損害代碼的完整性(過度優化)或運行時的完整性(濫用內存或中央處理器)。作爲一個方面說明,從數據庫中獲取數百萬行肯定會對某個地方產生明顯的影響。你通常必須決定何時/何時會傷害更少!