![](/img/trans.png)
[英]How do I use LINQ Contains(string[]) instead of Contains(string)
[英]LINQ to SQL and Null strings, how do I use Contains?
这是查询
from a in this._addresses
where a.Street.Contains(street) || a.StreetAdditional.Contains(streetAdditional)
select a).ToList<Address>()
如果where子句中的两个属性都有值,这可以正常工作,但是如果例如a.StreetAdditional为null(大多数时候),我将得到一个空引用异常。
有没有解决这个问题?
谢谢,
我使用null-coalescing运算符...
(from a in this._addresses
where (a.Street ?? "").Contains(street) || (a.StreetAdditional ?? "").Contains(streetAdditional)
select a).ToList<Address>()
最明显的一个:
from a in this._addresses
where (a.Street != null && a.Street.Contains(street)) || (a.StreetAdditional != null && a.StreetAdditional.Contains(streetAdditional))
select a).ToList<Address>()
或者,您可以为Contains编写一个扩展方法,该方法接受null参数而不会出错。 有些人可能会说拥有这样的方法并不是那么漂亮,因为它看起来像普通的方法调用,但是允许空值(从而放弃了正常的空值检查实践)。
如果StreetAdditional
为null
您必须先检查。
尝试
where a.Street.Contains(street) || ((a != null) && a.StreetAdditional.Contains(streetAdditional))
这是因为&&
是一个快捷操作符 ,如果a != null
产生false,则不会计算具有null
-value的第二个表达式,因为无论如何结果都是false
。
我会创建一个扩展方法,如果返回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>()
我不认为SqlServer给你一个null异常。 如果确实如此,那么这段代码显然没有运行LinqToSql(因为你已经标记了问题)。
string.Contains将被翻译为sql之like
,它对null值没有任何问题。
您可能需要检查以确保变量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>()
检查以确保属性不为null
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检查为false,则&&之后的第二个子句将不会计算。
from a in this._addresses
where a.Street.Contains(street) || (a.StreetAdditional != null && a.StreetAdditional.Contains(streetAdditional)
select a).ToList<Address>()
需要注意的一点是,应首先评估null。
where (**a.Street != null** && a.Street.Contains(street)) || (a.StreetAdditional != null && a.StreetAdditional.Contains(streetAdditional))
select a).ToList<Address>
()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.