它接缝简单,但我真的不明白。我正在使用linq和Entity Framework通过这样的简单查询从数据库中检索对象
loggedinUser = (from user in context.Users
where user == _guid
select user).ToList()[0];
我知道我可以使用.FirstOrDefault()
,但我不认为我的问题与我获取用户的方式有关。
获得用户后如果我使用此条件检查
if (loggedinUser != null)
{
ToLocation = String.Format("{0} {1} {2} {3}", loggedinUser.StreetAddress,loggedinUser.City, loggedinUser.Province, loggedinUser.PostalCode);
}
它不起作用,好像它是null
,但它不是。当我使用这个条件时它会起作用。
if (loggedinUser == null)
{ }
else
{
ToLocation = String.Format("{0} {1} {2} {3}", loggedinUser.StreetAddress,loggedinUser.City, loggedinUser.Province, loggedinUser.PostalCode);
}
我总是使用这种类型的条件(Obj != null)
并且它有效,答案应该很简单,但我不明白为什么它不会这次。我错过了什么吗?
唯一的一点是这个实体的类位于另一个项目中。可能是问题吗?
该类所在的项目位于VB.Net:
<Table("Users")>
Public Class User
<Key()>
Public Property UserID As Integer
Public Property Username As String
Public Property PasswordEncrypted As String
Public Property LastLogin As DateTime
Public Property CreatedByUserID As Integer
Public Property DateCreated As DateTime
Public Property Deleted As Boolean '?
Public Property Email As String
Public Property StreetAddress As String
Public Property City As String
Public Property Province As String
Public Property PostalCode As String
<NotMapped()>
Public Property Lat As Double
<NotMapped()>
Public Property Lon As Double
Public Property GUID As String
<NotMapped()>
Public Property EULAAgreed As DateTime
Public Overrides Function ToString() As String
Return Username
End Function
Public Overrides Function Equals(ByVal obj As Object) As Boolean
If (obj Is System.DBNull.Value) Then
Return MyBase.Equals(obj)
ElseIf (TypeOf obj Is String) Then
Return MyBase.Equals(obj)
Else
Try
Return UserID = CType(obj, Entities.User).UserID
Catch ex As Exception
Return UserID
End Try
End If
End Function
结束班
答案 0 :(得分:4)
这是因为LINQ-SQL / EF不会给你null。他们给你DBNull。
将您的比较更改为:
if (loggedinUser != DBNull.Value)
答案 1 :(得分:2)
你可能有这样的代码:
if (loggedinUser != null)
doSomething();
doSomethingElse();
问题是if
的范围以第一个语句结束。如果您有多个陈述,请附上大括号。
if (loggedinUser != null)
{
doSomething();
doSomethingElse();
}
答案 2 :(得分:1)
虽然你得到了问题的答案。但这些答案仍然值得一读。
嗯,null不是任何类型的实例。相反,它是无效的参考。
但是,System.DbNull.Value是对System.DbNull实例的有效引用(System.DbNull是单例,System.DbNull.Value为您提供对该类的单个实例的引用),表示不存在*数据库中的值。
*我们通常会说null,但我不想混淆这个问题。
所以,两者之间存在很大的概念差异。关键字null表示无效引用。 System.DbNull类表示数据库字段中不存在的值。通常,我们应该尝试避免使用相同的东西(在本例中为null)来表示两个非常不同的概念(在这种情况下,无效的引用与数据库字段中的不存在的值)。
请记住,这就是为什么很多人提倡一般使用null object pattern,这正是System.DbNull的一个例子。
以及Marc在What is the point of DBNull?
中的一个非常好的解释