2012-07-09 91 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。

试一下也。