LINQ to SQL и пустые строки, как мне использовать Contains? - PullRequest
24 голосов
/ 10 июня 2009

Вот запрос

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

если оба свойства в предложении where имеют значения, это прекрасно работает, но если, например, a.StreetAdditional - ноль (в большинстве случаев), я получу исключение нулевой ссылки.

Есть ли работа вокруг этого?

Спасибо

Ответы [ 9 ]

46 голосов
/ 10 июня 2009

Я бы использовал оператор слияния нуля ...

(from a in this._addresses
where (a.Street ?? "").Contains(street) || (a.StreetAdditional ?? "").Contains(streetAdditional)
select a).ToList<Address>()
43 голосов
/ 10 июня 2009

Самый очевидный:

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, который принимает нулевой аргумент без ошибок. Некоторые могут сказать, что такой метод не так хорош, потому что он выглядит как обычный вызов метода, но допускается для нулевых значений (таким образом, откладывая обычные методы проверки на ноль).

4 голосов
/ 10 июня 2009

Я бы создал метод расширения для возврата пустой последовательности, если он равен нулю, и затем вызов содержит метод.

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>()
4 голосов
/ 10 июня 2009

Вы должны сначала проверить, если StreetAdditional равно null.

Попробуйте

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

Это работает, потому что && является оператором быстрого вызова , и если a != null выдает false, второе выражение со значением null не будет оцениваться, так как результат будет false в любом случае.

2 голосов
/ 10 июня 2009

Я не думаю, что SqlServer дал вам нулевое исключение. Если это так, то этот код явно не работает через LinqToSql (как вы отметили вопрос).

string.Contains будет переведен в like sql, что не имеет проблем с нулевыми значениями.

1 голос
/ 29 ноября 2009

Возможно, вы захотите проверить, чтобы переменные street и streetAdditional не были нулевыми. Я просто столкнулся с той же проблемой, и установка их на пустую строку, казалось, решила мою проблему.

street = street ?? "";
streetAdditional = streetAdditional ?? "";
from a in this._addresses
where a.Street.Contains(street) || a.StreetAdditional.Contains(streetAdditional)
select a).ToList<Address>()
1 голос
/ 10 июня 2009
from a in this._addresses
where a.Street.Contains(street) || (a.StreetAdditional != null && a.StreetAdditional.Contains(streetAdditional)
select a).ToList<Address>()
1 голос
/ 10 июня 2009

Убедитесь, что свойства не равны нулю

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

Если проверка нуля ложна, то второе предложение после && не будет оцениваться.

0 голосов
/ 22 февраля 2016

Следует отметить, что значение null должно оцениваться первым.

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

()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...