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()
如果StreetAdditional
为null
您必须先检查。
尝试
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
()
- 有条件地禁用ASP.NET MVC控制器
- 在应用程序启动时调用XNA GraphicsDeviceManager.ApplyChanges()会导致闪烁
- 如何使用WMI导出特定源的Windows事件日志?
- .NET LDAP路径实用程序(C#)
- 能够在WCF中将主要对象从客户端传送到服务端
- 为什么我可以通过索引访问KeyCollection / ValueCollection中的项目,即使它没有实现IList(Of Key)?
- 当你没有类的源代码时,是否可以对对象进行.NET二进制序列化?
- 为什么CancellationTokenRegistration存在,为什么它实现IDisposable
- 如何在C#中使用SMO列出可用的SQL Server实例?