2014-01-28 116 views
0

我从数据库拉结果但是当列中出现空值时我得到一个错误 并使用convert.todatetime格式化日期以显示在gridview中在页面上。linq查询中的空值抛出空值错误

var ua = from utilacti in db.utility_activations 
      where utilacti.ua_case_number == property.property_case_number 
      select new 
      { 
       id = utilacti.ua_id, 
       Buyer = utilacti.ua_b, 
       BuyerPhone = utilacti.ua_b_p, 
       BuyerEmail = utilacti.ua_b_e, 
       BrokerAgent = utilacti.ua_ba_n, 
       BAPhone = utilacti.ua_b_p, 
       BAEmail = utilacti.ua_b_email, 
       Date = Convert.ToDateTime(utilacti.ua_d).ToShortDateString(),           
       TonD = Convert.ToDateTime(utilacti.ua_td).ToShortDateString(), 
       ToffD = Convert.ToDateTime(utilacti.ua_tod).ToShortDateString(), 
       ApprovalD = Convert.ToDateTime(utilacti.ua_ad).ToShortDateString() 
      }; 

我试图使转换成以下,以便可为空值

Convert.ToDateTime((DateTime?)utilacti.ua_td).ToShortDateString() 

但它不工作。

我试着检查空值。我试图做一个如果在那里检查一个值,但它出错。

任何想法。

+1

尝试使用DBNull.Value.Equals(utilacti.ua_td)或任何您的列名是 – gh9

+0

意外的类型代码:DBNull ...没有去 – Prescient

+0

我只是将此视为滥用'var'和匿名类。 ..如果你没有为15个不同的领域(其中一些派生出)编写'select',那么你从来没有遇到过这些问题。 – evanmcdonnal

回答

3

检查空,然后再转换,如:

Date = utilacti.ua_d == null ? "" : Convert.ToDateTime(utilacti.ua_d).ToShortDateString() 

如果utilacti.ua_dDateTime?类型或Nullable<DateTime>,那么你可以这样做:

Date = utilacti.ua_d.HasValue ? utilacti.ua_d.Value.ToShortDateString() : "" //or null 

如果您正重新DBNull那么你可以使用Convert.IsDbNull方法如:

Date = Convert.IsDBNull(utilacti.ua_d) ? "" : utilacti.ua_d.Value.ToShortDateString() 
+0

System.InvalidOperationException:无法翻译表达式 – Prescient

+0

你让我思考。如果我这样做。 ApprovalD =(DateTime?)utilacti.ua_approval_date 它的工作原理。但是当我试图做shortdatestring或somethign它出错 – Prescient

0

感谢哈比,他让我看着另一个方向。

Get short date for System Nullable datetime (datetime ?) in C#

ApprovalD = string.Format("{0:d}", utilacti.ua_ad) 

这似乎是任何时候你试图添加ToShortDateString()来提高你的错误可能的空值。空值不能被分析。这不是DateTime obj。尝试使用?:运算符进行检查会中断查询并引发错误。

但是string.Format完全忽略了null。它只是工作。