2014-01-22 30 views
3

它接縫簡單,但我真的不明白它。我正在使用LINQ和Entity Framework通過這樣(OBJ!= NULL)不起作用

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檢查後,但它是not.when我用這個條件它的工作原理。

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 

末級

+5

一個很好的解釋還有別的事情上。我們可以看到實際的空檢查嗎? –

+0

在第一種情況下,它是多線聲明嗎?如果是這樣,它是用'{..}'包裹的嗎?如果不是,只有'if'後面的第一行獲得了'if'的應用。 – Magus

+0

我改變了它有我的完整代碼。 –

回答

4

這是因爲LINQ-SQL/EF不給你空。他們給你DBNull。

你比較改成這樣:

if (loggedinUser != DBNull.Value) 
+1

你是什麼意思由LINQ不給你null?當然,它會給你null,如果它是真的,那麼如果陳述如何工作,那又怎麼樣呢? –

+0

但我說它在代碼的其他部分工作得很好。 –

+0

@ Selman22不是LINQ,而是LINQ-SQL。 – rae1

2

這有可能是你有這樣的代碼:

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

的問題是,if的範圍與第一條語句結束。如果您有多條語句,請加上大括號。

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

謝謝,但這只是我在這裏輸入時的一個錯誤。 –

1

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

那麼,null不是任何類型的實例。相反,這是一個無效的參考。

但是,System.DbNull.Value是對System.DbNull實例的有效引用(System.DbNull是一個單例,System.DbNull.Value爲您提供對該類的單個實例的引用),它代表數據庫中不存在*值。 *我們通常會說空,但我不想混淆這個問題。

因此,這兩者之間存在很大的概念差異。關鍵字null表示無效的引用。類System.DbNull表示數據庫字段中不存在的值。一般來說,我們應該儘量避免使用相同的東西(在這種情況下爲null)來表示兩個非常不同的概念(在這種情況下,數據庫字段中的值是無效的,而不是一個不存在的值)。

請記住,這就是爲什麼很多人主張通常使用null object pattern,這正是System.DbNull的一個例子。

Original Source

和馬克在What is the point of DBNull?