2014-10-27 50 views
-2

我有一個LINQ查詢:比較對象int或dbnull.value LINQ

var capacityQuery = from Info in mySQLDataTable.AsEnumerable() where Info.Field<object>("location") == Location.ID orderby Info.Field<DateTime>("date")

線 「其中Info.Field(」 位置 「)== Location.ID」 是我在哪裏有問題

我的問題是。我該怎麼做在WHERE語句的比較可能是A DBNull.Value或int值兩邊

以下是參考:

位置是一個自定義類。該ID返回一個對象。

private int? addressID; 

    public object ID { 
     get 
     { 
      if (addressID == null) 
       return DBNull.Value; 
      else 
       return addressID; 
     } 
    } 

它必須是DBNull的原因是因爲它來自數據庫。 「表格」也是從數據庫中填入的。

我知道==在這種情況下是錯誤的,因爲它比較顯然是錯誤的引用。

我知道object.equal(var1,var2)應該可以工作,但它不會猜測是因爲它們是2個不同的對象。

這些值可以是int或DBNull,既可以在表格端也可以在類端。

這是在foreach循環中,所以我使用相同的查詢,其中位置有一個int值或具有DBNull值。

再次我的問題是。我該怎麼做在WHERE語句的比較可能是A DBNull.Value或int值兩邊

+0

你的問題是什麼?另外,你應該在SQL查詢中的數據庫中進行這種過濾,而不是在應用程序端進行。 – Servy 2014-10-27 16:52:54

+0

希望更清楚地添加問題。 – BrinkDaDrink 2014-10-27 17:08:43

回答

0

使用

private int? addressID; 

public object ID { 
    get 
    { 
     return addressID.HasValue ? addressID.Value as object : DBNull.Value;  
    } 
} 

代替。這樣,如果addressID尚未初始化,或者它已被故意設置爲null,則ID屬性將返回一個DBNull.Value。否則,它將返回一個int,但是你必須將它自己從object轉換爲int或int ?.儘管如此,創建空值被作者稱爲「十億美元的錯誤」,但現在我認爲它已經達到了數十萬億美元。你應該返回一個int?數據類型,如果可以的話,在這種情況下,比較將始終有效。我不確定你使用了哪個ORM,但據我所知,Dapper和linq2db可以正確處理這種情況。

+0

我不相信我的對象是問題。只需在Where語句中進行比較。此外,這會返回一個錯誤,指出「int和'System.DBNull'之間沒有隱式轉換 – BrinkDaDrink 2014-10-27 17:10:40

+0

忘了投它它現在編譯這個方法爲您提供最安全的測試,如果已經賦值或者它一片空白。 – Darek 2014-10-27 17:16:00