实体框架:vb.net处理中可为空的DateTime toString(格式)

时间:2013-07-29 08:17:20

标签: vb.net datetime entity-framework-4.1

给定一个带有DateTime字段生日(非空)的表元素,在实体框架4中我可以这样做:

Dim mylist = (From el in Element Select el).ToList()
     .Select(function(el) new with { 
           .bday = el.birthday.toString("dd/MM/yy") 
           }

我现在需要将生日改为可以为空,因此我在SQL Server中更改表,然后在Visual Studio中更新我的ModelDB。 结果就是这一行:

           .bday = el.birthday.toString("dd/MM/yy") 

引发异常为“从整数到字符串的无效转换”dd / mm / yy“)。 使其“固定”的唯一方法是以这种方式改变线:

           .bday = CDate(el.birthday).toString("dd/MM/yy") 

这是正确的做法吗? 现在我有一个可以为空的Datetime,当el.birthday为空时如何处理这个案例?

谢谢!

2 个答案:

答案 0 :(得分:2)

如果你做了一个小实验,你会完全理解发生了什么:

Dim normalDate As Date = Now
Dim nullableDate As Nullable(Of Date) = normalDate

Dim normalToText As String = normalDate.ToString("dd/MM/yy") 'Works perfectly

Dim nullableToText As String = nullableDate.ToString("dd/MM/yy") 'Error

两个变量normalDatenullableDate中的内容相同,但它们不相同:ToString("date in certain format")功能需要Date类型作为输入;你发送的是Date类型的修改版本(没有太大的不同,但也不一样)。使用CDate您正在做的是将Date的修改版本转换为实际有效的Date类型,因此ToString()功能可以正常工作。

你做对了吗?是的,就CDate可以处理“空值”而言(CDate(Nothing)不会输出任何错误):您正在调整给定变量以适应ToString()的期望。

注意:我已经检查了上面代码的确切错误输出,它有效地传递了“从字符串转换”dd / MM / yy“到类型'整数'无效。”。因此,当打算使用具有可为空日期的ToString(“date”)时,您获得的错误是标准错误;没有太描述性的错误,这是真的。

答案 1 :(得分:0)

在处理可为空的属性时,db列将映射到System.Nullable(Of T)(See Documentation)。因此,在您的情况下,el.birthday应该已经映射到Nullable(Of DateTime)。此类具有两个属性来处理您遇到的情况,分别是.ValueDoc)和.HasValueDoc)。

特定于类型的实际值存储在.Value中,因此在您的情况下,您需要执行以下操作:

.bday = el.birthday.value.toString("dd/MM/yy") 

或者您可以使用.HasValue返回布尔值以指示是否存在值:

If el.birthday.HasValue Then
   .bday = el.birthday.toString("dd/MM/yy") 
End If