LINQ检查空值

时间:2012-07-09 01:38:37

标签: asp.net-mvc linq nullable

如何检查Linq中的Null?

我有第三方代码,该代码返回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 types语句{/ 1}}上的错误。

我尝试使用以下代码但返回强制转换异常(无法从字符串转换为DateTime?)

Birthdate=

有没有办法快速检查空值?

3 个答案:

答案 0 :(得分:6)

我没有对此进行过测试,但您可以尝试以下方法:

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

来自MSDN

  

Field方法支持将列作为可空类型进行访问。如果DataSet中的基础值是[DBNull。] Value,则返回的可空类型的值将为null。

答案 1 :(得分:1)

您可以创建一个辅助函数来检查DBNull的值,如下所示:

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

现在您可以在LINQ查询中使用此方法:

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

答案 2 :(得分:0)

我使用上面的代码时出错了。我想我们可以使用下面的代码。

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

如果我们使用Convert.ToString(dr["BirthDate"]),那么它转换为空字符串,如果它有DBNull。

也尝试一下。