繁体   English   中英

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

[英]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参数而不会出错。 有些人可能会说拥有这样的方法并不是那么漂亮,因为它看起来像普通的方法调用,但是允许空值(从而放弃了正常的空值检查实践)。

如果StreetAdditionalnull您必须先检查。

尝试

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM