2014-01-27 1 views
0
results = results.Where(x => x.SomeValue ?? 0 == 0); 

값이 null인지, null인지 확인하려면 0으로 만들고 비교하십시오.?? 연산자 Lambda LINQ

나는

오류 메시지가) (여분의 괄호를 넣어하는 방법을 모른다 :

+4

필요한 것보다 더 많은 괄호를 넣고 작동이 멈출 때까지 제거하십시오. 시험하기에 충분히 간단합니다. – Servy

+0

null-coalescing으로 인해 많은 문제가 발생하는 경우 null을 확인하는 것이 가장 좋은 이유는 무엇입니까? '(x => x == null || x == 0)'? 나는 그 의도가 분명하다고 주장 할 것이다. –

답변

7
results = results.Where(x => (x.SomeValue ?? 0) == 0); 

그러나 당신이 nullable 형식을 다루는 경우 내가 널 위해 더 많은 읽을 명시 적으로 확인 발견 :

results = results.Where(x => !x.SomeValue.HasValue || x.SomeValue == 0); 

또 다른 옵션입니다 fo를 0을 반환합니다 GetValueOrDefault() 방법, R 정수 (긴, 바이트) :

results = results.Where(x => (x.SomeValue ?? 0) == 0); 

하지만 당신은 할 수 있습니다

results = results.Where(x => x.SomeValue.GetValueOrDefault() == 0); 
3

이 시도 ...

results = results.Where(x => (x.SomeValue ?? 0) == 0); 
1

null 허용의 INT가 x.SomeValue입니다 가정하면,이 작업을 수행 할 수 있습니다 null 값을 같은 유형의 값으로 "바꿉니다". 문자열이거나 다른 것 인 경우에는 작동하지 않습니다.

당신은뿐만 아니라 인라인 경우 연산자를 사용하여이 작업을 수행 할 수 있습니다 :

results = results.Where(x => x.SomeValue == null ? true : x.SomeValue == 0) 
+0

물론 Sergey가 언급했듯이 가독성이 중요합니다. 이들 중 어느 것도 명시 적 비교처럼 읽을 수 없습니다. –

1

당신은 널 (NULL)의 INT해야합니다이를 위해 입력 (INT를?).

results = results.Where(x => (x.SomeValue ?? 0) == 0); 
+0

감사합니다. 괄호를 어디에 넣어야할지 몰랐습니다. D –