2009-06-10 70 views
20

下面是該查詢LINQ to SQL和空字符串,如何使用Contains?

from a in this._addresses 
where a.Street.Contains(street) || a.StreetAdditional.Contains(streetAdditional) 
select a).ToList<Address>() 

如果這兩個屬性的where子句也值這工作得很好,但是如果舉例來說,a.StreetAdditional爲空(大部分的時間),我會得到一個空引用異常。

有沒有解決這個問題的方法?

感謝,

+0

你得到一個異常?或者你猜測可能有例外嗎? – 2009-06-10 18:07:39

+0

我得到了異常。 – Oakcool 2009-06-12 18:58:34

+0

如果你有一個`NullReferenceException`,你沒有做一個LINQ to SQL查詢。 – 2009-11-29 05:17:05

回答

37

最明顯的一個:

from a in this._addresses 
where (a.Street != null && a.Street.Contains(street)) || (a.StreetAdditional != null && a.StreetAdditional.Contains(streetAdditional)) 
select a).ToList<Address>() 

或者你可以爲包含接受沒有錯誤null參數寫的擴展方法。有些人可能會說,擁有這樣的方法並不是那麼漂亮,因爲它看起來像是一個普通的方法調用,但是允許使用空值(從而留出了普通的空檢查實踐)。

1

檢查,以確保該屬性非空

from a in this._addresses 
where (a.Street != null && a.Street.Contains(street)) || 
(a.StreetAdditional != null && a.StreetAdditional.Contains(streetAdditional)) 
select a).ToList<Address>() 

如果空支票是假的,那麼& &之後的第二條款不會評價。

1
from a in this._addresses 
where a.Street.Contains(street) || (a.StreetAdditional != null && a.StreetAdditional.Contains(streetAdditional) 
select a).ToList<Address>() 
3

必須首先檢查是否StreetAdditionalnull

嘗試

where a.Street.Contains(street) || ((a != null) && a.StreetAdditional.Contains(streetAdditional)) 

這工作,因爲&&快捷運營商如果a != null產生false,與null第二式 - 值將不進行評估,因爲其結果將是false反正。

4

我會創建一個擴展方法來返回一個空序列,如果爲null,然後調用contains方法。

public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> pSeq) 
{ 
     return pSeq ?? Enumerable.Empty<T>(); 
} 

from a in this._addresses 
where a.Street.Contains(street) || 
     a.StreetAdditional.EmptyIfNull().Contains(streetAdditional) 
select a).ToList<Address>() 
42

我會使用空合併運算符...

(from a in this._addresses 
where (a.Street ?? "").Contains(street) || (a.StreetAdditional ?? "").Contains(streetAdditional) 
select a).ToList<Address>() 
2

我不認爲SqlServer的給你一個空例外。如果是這樣的話,那麼這段代碼顯然不是通過LinqToSql運行的(正如你已經標記了這個問題)。

string.Contains將被轉換爲sql的like,這對空值沒有任何問題。

1

您可能需要檢查以確保變量street和streetAdditional不爲null。我只是遇到了同樣的問題,並將它們設置爲空字符串似乎解決了我的問題。

street = street ?? ""; 
streetAdditional = streetAdditional ?? ""; 
from a in this._addresses 
where a.Street.Contains(street) || a.StreetAdditional.Contains(streetAdditional) 
select a).ToList<Address>() 
-1

要注意的一件事是,應該首先評估空值。

where (**a.Street != null** && a.Street.Contains(street)) || (a.StreetAdditional != null && a.StreetAdditional.Contains(streetAdditional)) 
select a).ToList<Address> 

()

相關問題