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

Oak*_*ool 25 .net c# linq-to-sql

这是查询

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

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

有没有解决这个问题?

谢谢,

Yul*_*liy 48

我使用null-coalescing运算符...

(from a in this._addresses
where (a.Street ?? "").Contains(street) || (a.StreetAdditional ?? "").Contains(streetAdditional)
select a).ToList<Address>()
Run Code Online (Sandbox Code Playgroud)

  • 这是一种更清洁的方法.在处理IQueryable <T>时非常适合 (4认同)

dri*_*iis 43

最明显的一个:

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

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

  • 自定义扩展方法在LINQ to SQL中不可用. (4认同)

Dar*_*rio 5

您必须先检查是否StreetAdditionalnull

尝试

where a.Street.Contains(street) || ((a != null) && a.StreetAdditional.Contains(streetAdditional))
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为它&&是一个快捷操作符,如果a != null产生 false,null则不会评估带有-value的第二个表达式,因为false无论如何结果都是如此。