2011-06-03 24 views
5

我有一個表有一些可空的雙字段。與LinqToSQL工作試圖用現場直接,我得到如何正確處理LinqToSql類的System.Nullable <T>字段?

參數類型System.Nullable不分配給參數類型雙

如何處理這是否正確?

+0

這真的和LINQ無關。考慮一個更通用的SO搜索來處理Nullable值。 – 2011-06-03 22:17:48

+3

你應該真的發佈實際的代碼以及實際的錯誤信息。請不要讓我們猜你正在嘗試做什麼。 – Gabe 2011-06-03 22:24:17

回答

18

這個問題與Linq無關。這與doubledouble?/Nullable<double>之間的轉換有關。

double?double隱式轉換是不允許的:

double? foo ; 
double bar = foo ; 
  • 您可以直接引用的雙重價值:

    double? foo ; 
    double bar = foo.Value ; 
    

    ,這將拋出一個NullReferenceException如果Nullable<T>爲空(即.HasValue爲false)。

  • 你可以將它轉換:

    double? foo ; 
    double bar = (double) foo ; 
    

    同樣,你會得到一個異常,如果Nullabl<T>爲null。

  • 可以使用空合併運算符來指定一個默認值,如果Nullable<T>爲null:

    double? foo ; 
    double bar = foo ?? -1.0 ; 
    

    這natch,避免NullReferenceException`問題。

  • 您可以使用三元運算在同樣的空合併運算符:

    double? foo ; 
    double bar = (foo.HasValue ? foo.Value : -2) ; 
    
  • 最後,你可以使用普通的條件邏輯遵循另一種路徑:

    double? foo ; 
    double bar ; 
    
    if (foo.HasValue) 
    { 
        doSomething(foo.Value) ; 
    } 
    else 
    { 
        doSomething() ; 
    } 
    

這些是關於選項。哪個是對的?不知道。取決於你的情況。

-1

您可以投它:double yourVariable = (double)ValueFromDb或者您可以獲取double?的值:double yourVaraible = ValueFromDb.Value。兩者都是正確的。

+2

而且兩者都可能爆炸*。考慮'double v = nullabledouble ?? somedefaultdouble',例如'double age = nullableAge ?? Double.NaN'(是的,我計算在這幾天的小數年內;-) – 2011-06-03 22:15:22

+0

請確保您使用第二個版本,通過檢查空值合併運算符'空值'是否爲空值 – Sung 2011-06-03 22:15:38

7

您可以使用

double value = theObject.TheProperty.GetValueOrDefault(); 

當你有一個Nullable<T>,你需要T類型的值。這將正常化任何null到的T的默認值,這將是用於雙0.0。如果你想要的東西其他比默認,你可以解決它的另一種方式。

double value = theObject.TheProperty ?? 1d; // where 1 replaces any null 
+1

+1?和'GetValueOrDefault' – 2011-06-03 22:19:33

2

有兩種方法。

  1. 使用可爲空的類型,如double ?.你的實體類可以擁有雙重屬性?並且您的客戶端代碼將與可空類型一起使用。

    public class Person 
    { 
    
        public string FirstName { get; set; } 
    
        public string LastName { get; set; } 
        public double? Age { get; set; } 
    
        public Person() 
        { 
        } 
        public Person(IDataRecord record) 
        { 
         FirstName = (string) record["first_name"]; 
         LastName = (string) record["last_name"]; 
         Age = (double?) record["age"]; 
        } 
    } 
    
  2. 編寫選擇一個安全的默認值,如果NULL是目前分配周圍的包裝。我喜歡使用數據記錄類的擴展方法,並在其中放置一個SafeConvert方法。