2009-06-10 2 views
20

여기에 쿼리LINQ to SQL 및 Null 문자열, Contains는 어떻게 사용합니까?

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

경우입니다 모두 속성 조항이 잘 값을 작동했지만, 예를 들어, a.StreetAdditional은 (시간의 대부분을) null의 경우, 내가 null 참조 예외를 얻을 것이다 어디 .

해결 방법이 있습니까?

감사합니다,

+0

당신은 예외가 발생 했습니까? 아니면 예외가 가능한 것보다 추측하고 있습니까? –

+0

예외가 있습니다. – Oakcool

+0

그것에 대해'NullReferenceException'이 있다면 LINQ to SQL 쿼리를 수행하지 않습니다. –

답변

37

가장 눈에 띄는 하나가 오류없이 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 값이 허용되므로 (정상적인 null 확인 방법을 제외하고) 이러한 메서드를 사용하는 것이 그리 좋지 않다고 말할 수도 있습니다. 널 검사가 거짓이면

+0

작동하는 것처럼 보입니다. 감사합니다. – Oakcool

+4

LINQ to SQL에서 사용자 지정 확장 메서드를 사용할 수 없습니다. –

1

확인이 속성

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이 아닌 것을 확인하기 위해, 다음 & &에 이어 두 번째 절은 평가하지 않습니다. StreetAdditionalnull 경우

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

먼저 확인해야합니다.

&&바로 가기 연산자 때문에이 작동

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

을 시도하고 a != null이 거짓 산출하면 결과가 어쨌든 false 될 것입니다 때문에, null와 두 번째 표현은 - 값은 평가되지 않습니다.

4

널 (null)이면 빈시 v 스를 리턴하는 확장 메소드를 작성한 후 메소드를 호출하십시오.

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>() 
+0

'null' 객체가 멤버 함수를 호출 할 수있는 것처럼 보이기 때문에 다소 이상하게 보입니다. – Dario

+0

의 사용을위한 Upvote ?? 운영자. 그것이 내가 제안한 것입니다. 확장 메서드를 사용하면 확장 메서드없이 쿼리를 이상하게 보일 수 있다고 생각하면됩니다. –

42

내가 널 병합 연산자를 사용하는 거라고 ...

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

이것은 더 깨끗한 접근법입니다. IQueryable을 사용할 때 완벽한 DanKodi

2

나는 SQLSERVER 당신에게 널 예외를 준 생각하지 않습니다. 만약 그렇다면,이 코드는 분명히 LinqToSql을 통해 실행되지 않습니다 (질문에 태그를 달았 기 때문에).

string.contains는 null 값으로 전혀 문제가없는 sql의 like으로 변환됩니다.

1

변수 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>() 
-1

주목할 점은 먼저 null을 평가해야한다는 것입니다.

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

()