给定一个带有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为null时如何处理这个案例呢?
谢谢!
如果你做一个小实验,你会完全理解发生了什么:
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
两个变量normalDate
和nullableDate
中的内容是相同的,但它们不是:ToString("date in certain format")
功能期望Date
类型作为输入;你发送的是Date类型的修改版本(没有太大的不同,但也不一样)。使用CDate
您正在做的是将Date的修改版本转换为实际有效的Date类型,因此ToString()功能可以正常工作。
你做对了吗?是的,就CDate可以处理“空值”而言(CDate(Nothing)
不会输出任何错误):您正在调整给定变量以适应ToString()的期望。
注意:我已经检查了上面代码的确切错误输出,它有效地传递了“从字符串转换”dd / MM / yy“到类型'整数'无效。”。因此,当打算使用具有可为空日期的ToString(“date”)时,您获得的错误是标准错误;没有太描述性的错误,这是事实。
处理可空属性时,db列将映射到System.Nullable(Of T)(See Documentation)。所以在你的情况下,el.birthday
应该已经映射到Nullable(Of DateTime)
。这个类有两个属性来处理你的情况,即.Value
(Doc)和.HasValue
(Doc)。
实际的类型特定值存储在.Value
中,因此在您的情况下,您需要执行以下操作:
.bday = el.birthday.value.toString("dd/MM/yy")
或者您可以使用返回布尔值的.HasValue
来指示是否存在值:
If el.birthday.HasValue Then
.bday = el.birthday.toString("dd/MM/yy")
End If