簡體   English   中英

(obj!= null)不起作用

[英](obj != null) doesn't work

它接縫簡單,但我真的不明白。我正在使用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

結束班

這是因為LINQ-SQL / EF不會給你null。 他們給你DBNull。

將您的比較更改為:

if (loggedinUser != DBNull.Value)

你可能有這樣的代碼:

if (loggedinUser != null)
    doSomething();
    doSomethingElse();

問題是if的范圍以第一個語句結束。 如果您有多個語句,請包括大括號。

if (loggedinUser != null)
{
    doSomething();
    doSomethingElse();
}

雖然你得到了你的問題的答案。 但這些答案仍然值得一讀。

好吧,null不是任何類型的實例。 相反,它是一個無效的引用。

但是,System.DbNull.Value是對System.DbNull實例的有效引用(System.DbNull是單例,System.DbNull.Value為您提供對該類的單個實例的引用),表示不存在的*值數據庫。

*我們通常會說null,但我不想混淆這個問題。

所以,兩者之間存在很大的概念差異。 關鍵字null表示無效引用。 System.DbNull類表示數據庫字段中不存在的值。 通常,我們應該嘗試避免使用相同的東西(在本例中為null)來表示兩個非常不同的概念(在這種情況下,無效的引用與數據庫字段中的不存在的值)。

請記住,這就是為什么很多人提倡一般使用null對象模式 ,這正是System.DbNull的一個例子。

原始來源

Marc的一個非常好的解釋是DBNull有什么意義?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM