.net LINQ to SQL和空字符串,如何使用Contains?

dgiusagp  于 2022-11-26  发布在  .NET
关注(0)|答案(9)|浏览(173)

下面是查询

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

如果where子句中的两个属性都有值,这就可以正常工作,但是如果a.StreetAdditional为null(大多数情况下),我将得到一个null引用异常。
有解决这个问题的方法吗?

w1e3prcc

w1e3prcc1#

我会使用空合并运算符...

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

yxyvkwin2#

最明显的一条:

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编写一个扩展方法,它接受空参数而不出错。有些人可能会说,拥有这样一个方法并不太好,因为它看起来像一个普通的方法调用,但它允许空值(从而把普通的空检查实践放在一边)。

0mkxixxg

0mkxixxg3#

您必须先检查StreetAdditional是否为null
尝试

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

这是因为&&是一个 shortcut-operator,如果a != null的结果为false,则第二个带有null值的表达式将不会被求值,因为结果将是false

cqoc49vn

cqoc49vn4#

我将创建一个扩展方法,如果为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>()
mccptt67

mccptt675#

我不认为SqlServer给了你一个空异常。如果它给了,那么这段代码显然不是通过LinqToSql运行的(因为你已经标记了这个问题)。
contains将被转换为sql的like,它对空值完全没有问题。

ztigrdn8

ztigrdn86#

检查以确保属性不为空

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

如果空值检查为false,则&&后面的第二个子句将不会求值。

nmpmafwu

nmpmafwu7#

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

anauzrmj8#

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

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

tktrz96b9#

需要注意的一点是,应首先计算null。

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

()

相关问题