LINQ to SQL和Null字符串,我如何使用Contains?

这是查询

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

如果where子句中的两个属性都有值,这可以正常工作,但是如果例如a.StreetAdditional为null(大多数时候),我将得到一个空引用exception。

有没有解决这个问题?

谢谢,

最明显的一个:

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

或者,您可以为Contains编写一个扩展方法,该方法接受null参数而不会出错。 有些人可能会说拥有这样一个方法并不是那么漂亮,因为它看起来像普通的方法调用,但是允许空值(从而放弃了正常的空值检查实践)。

我使用null-coalescing运算符…

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

如果StreetAdditionalnull您必须先检查。

尝试

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

这是因为&&是一个快捷操作符 ,如果a != null产生false,则不会计算具有null -value的第二个表达式,因为结果将是false

如果为null,我将创建一个返回空序列的扩展方法,然后调用contains方法。

 public static IEnumerable EmptyIfNull(this IEnumerable pSeq) { return pSeq ?? Enumerable.Empty(); } from a in this._addresses where a.Street.Contains(street) || a.StreetAdditional.EmptyIfNull().Contains(streetAdditional) select a).ToList
()

我不认为SqlServer给你一个nullexception。 如果确实如此,那么这段代码显然没有运行LinqToSql(因为你已经标记了问题)。

string.Contains将被翻译为sql之like ,它在使用null值时完全没有问题。

检查以确保属性不为null

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

如果null检查为false,则&&之后的第二个子句将不会计算。

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

您可能需要检查以确保变量street和streetAdditional不为null。 我刚遇到同样的问题并将它们设置为空字符串似乎解决了我的问题。

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

需要注意的一点是,应首先评估null。

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

()