2012-07-09 94 views
1

如何檢查Linq中的空值?LINQ檢查空值

我有一個第三方代碼,返回一個DataTable,列類型DateTime可爲空。

我的代碼:

var profile = (from d in ds.Tables[0].AsEnumerable() 
       select new User 
       { 
       FirstName = d["FirstName"].ToString(), 
       Birthdate = Convert.ToDateTime(d["BirthDate"].ToString()) 
       }).FirstOrDefault(); 

返回一個錯誤的Object cannot be cast from DBNull to other typesBirthdate=聲明。

我用下面的代碼嘗試,但返回一個轉換異常(無法從字符串轉換爲日期時間?)

Birthdate = (DateTime?)d["BirthDate"].ToString(); 

有沒有辦法來速記檢查空值?

回答

6

我沒有測試過這一點:

private static DateTime? ConvertNullableToDateTime(object val) { 
    return (val != null && val != DBNull.Value) ? Convert.ToDateTime(val.ToString()) : null; 
} 

現在你可以在你的LINQ查詢使用此方法,但您可以嘗試以下方法:

Birthdate = d.Field<DateTime?>("BirthDate") 

MSDN

Field方法提供對作爲可空類型訪問列的支持。如果DataSet中的基礎值是[DBNull。] Value,則返回的可空類型的值將爲null。

+1

+1中使用它,因爲這是DataSetExtenions的構建內容; Linq訪問數據集。 – dwerner 2012-07-09 02:09:02

+0

這個工作很棒。但是當我有一個對象作爲屬性時,例如'User.Location'和'Location'對象具有'ID'屬性,代碼'User.Location.Id = d.Field (「LocationId」)'失敗。我在這裏做錯了什麼? – Devmonster 2012-07-09 03:13:31

1

您可以創建一個輔助函數來檢查DBNull值,如下所示:

var profile = (from d in ds.Tables[0].AsEnumerable() 
      select new User 
      { 
      FirstName = d["FirstName"].ToString(), 
      Birthdate = ConvertNullableToDateTime(d["BirthDate"]) 
      }).FirstOrDefault(); 
+0

我在想同樣的事情。我想有不止一種方法來解決這個問題。我也考慮過使用擴展方法,但這種方法效果不好。我無法擴展DataTable的卓爾[「列」]。另一種方法是使用'as'關鍵字,但我想我不能在Linq語句 – Devmonster 2012-07-09 02:14:00

0

我在使用上面的代碼時出錯。我認爲我們可以使用下面的代碼。

Birthdate = dr["BirthDate"] == DBNull.Value ? (DateTime?)null : (DateTime)dr["BirthDate"]; 

如果我們使用Convert.ToString(dr["BirthDate"]),然後將其轉換爲空字符串,如果它的DBNull。

試一下也。