2012-07-10 3 views
5

많은 SQL 쿼리에 대해 .Net Framework 4 및 Linq to Entities를 사용하여 VB.Net에 여러 프로젝트가 있습니다. EF 로의 이전은 우리에게 새로운 변화입니다 (약 4-6 개월 동안 사용). 그리고 더 빨리 코딩 할 수 있기 때문에 고위 경영진의지지가 있습니다. 우리는 여전히 많은 수의 procs를 사용하지만 Linq를 통해 엔티티까지도 실행합니다.VB.Net 엔터티 Null 비교 Linq - 'Nothing'또는 'Nothing'입니까?

혼란 스러움을 분명히하기를 희망합니다. 나는 정답을 찾을 수 없습니다. 특정 필드가 NULL 값을 갖는 레코드를 원할 때 몇 가지 쿼리가 있습니다. 이 간단한 선택 쿼리, 왼쪽 조인없이 집계 또는이다 등 Microsoft는이 MSDN Link 같은 쿼리 보이는 뭔가를 권장합니다

dim query = from a in MyContext.MyTables 
Where a.MyField = Nothing 
Select a 

내가 할 여러 프로젝트가를 정확히 그것은 좋은 작품, IDE에서 더 경고하지 . 최근에 다른 개발자가 새 프로젝트를 만들었고 위와 같이 null 체크를하면 IDE에서 다음과 같은 경고 메시지가 나타납니다.

경고 1이 표현식은 항상 Nothing으로 평가됩니다). 값이 null인지 확인하려면 '아무것도 아니요'를 사용하십시오.

프로젝트를 비교할 때 각각에 대해 explicit 및 option strict 옵션이 설정되어 있습니다. 경고를 무시하면 앱이 실행될 때 찾고있는 정확한 레코드 집합을 얻게됩니다. = 기호를 IS로 변경하면 경고가 사라집니다. 그러나이 경고는 왜 다른 프로젝트가 아닌 하나의 프로젝트에서만 나타 났습니까? MSDN에서도 equals 연산자를 사용하는 예제가있을 때 혼란 스럽습니다.

+0

VB.NET LINQ에는 'Equals' 키워드도 있습니다. 나는 그것을 테스트 할 방법이 없지만, 대신 그것을 시도해 볼까? 'Where a.MyField Nothing' –

+0

@Cory : 'Join' 절 (AFAIK)에서만 사용되는 상황 별 키워드입니다. 나는 당신이 다른 곳에 그것을 사용할 수 있다고 생각하지 않는다. –

답변

2

여기 제가보고있는 내용은 MyFieldNullable(Of T) 유형입니다. 가능성이 원시적 Integer, Single, 등등 ...

컴파일러가 Nullable(Of T) 버전으로 원시 형에 대한 일반 항등 연산자를 촉진하기 때문에이 경고 메시지가 표시되는 이유는. 그것은 본질적으로하지만 다음

Dim myField As Integer? = a.MyField 
Dim other As Integer? = Nothing 
If myField = other Then 
... 
End If 

문제를 실행 Integer?이 값 Nothing이있는 경우는 아무것도 동등 비교하지 것입니다. 따라서 위의 Where 절은 항상 False을 반환합니다. 컴파일러는이 문제가있는 Nullable(Of T) 모서리에 대해 경고하고 에 null이 아닌 값이 있는지 확인하는 Is Nothing 검사로 이동하려고 시도하고 있습니다.

이 블로그 기사에는이 경고가 생성되는 이유와 그에 대한 모든 역학에 대한 매우 자세한 설명이 나와 있습니다. 이 기사는 C# 용으로 작성되었지만 기본 전제는 VB.Net에도 적용됩니다.

+0

그래서이 필드가 nullable이 아니기 때문에 하나의 쿼리에서 등호가 작동하지만 nullable이므로 다른 구문이 필요한 다른 쿼리에서는 문제였습니다. –

+0

@ChrisJones가 맞습니다. 일반적으로 당신은 null 값을 가진'='을 사용할 수 있습니다. 'Nothing'과의 비교는 항상 False를 반환 할 것입니다. 컴파일러가 그것에 대해 경고를합니다. – JaredPar

+0

이걸 좀 더 실행하면, 데이터베이스에서 nullable 인 문자열 필드에는 아무 것도 쓸 수 없지만 다른 데이터에서는 사용할 수 없습니다 Afshin이 언급 한 Has Nothing 또는 HasValue 멤버를 사용할 수 있습니다. 이것에 대해 약간의 설명을 해주셔서 감사드립니다. –

5

생성 된 열은 Nullable(Of T)

그래서 당신이 좋아하는 그 필드 값이 있는지 확인하거나 할 수 있어야한다 :

dim query = from a in MyContext.MyTables 
Where Not a.MyField.HasValue 
Select a 
+0

여러 데이터 형식에서이 시도한 및 문자열 값을 작동하지 않습니다. Nullable 정수, 날짜 및 부울 데이터 형식에 대해 HasValue 멤버를 사용할 수있었습니다. –

0

적어도 LINQ의 개체 대신 다음을 사용할 수 있습니다.

Nullable(Of Integer).Equals(a, b) 

두 값 모두 Nothing 일 수도 있고 둘 모두와도 잘 작동하지 않을 수도 있습니다.