给定一个带有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为空时如何处理这个案例?
谢谢!
答案 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
两个变量normalDate
和nullableDate
中的内容相同,但它们不相同: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)
。此类具有两个属性来处理您遇到的情况,分别是.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