2013-09-04 4 views
1

이것은 매우 간단하지만 내 인생에서 나는 이것의 한 가지 예를 찾을 수 없다고 확신합니다.Linq 중첩 그룹 가입 (null 일 경우)

테이블에 그룹 가입을하고 있는데 그룹화 된 가입에 대해 두 번째 가입을 원합니다.

표 1 주문 표 2 연락처 gcontact가 null의 경우이 쿼리 가입 마지막에 밖으로 오류가 발생하지

dim query = from order in Orders _ 
Group Join contact in Contacts On order.contactId equals contact.contactId Into grpContacts = Group From gcontact in grpContacts.DefaultIfEmpty() 
Group Join phone in PhoneNumbers On phone.phoneNumberId Equals gcontact.homePhoneId Into grpPhoneNumbers = Group from gphone in grpPhoneNumbers.DefaultIfEmpty() 

표 3 전화 번호

. 어느 것이 합리적인지 ...하지만 어쨌든이 조인을 수행하고 레코드가 존재하지 않는 경우 null/nothing 값을 갖는 방법은 무엇입니까?

UPDATE 다른 사람이로 실행하면 이전 그룹이 아무것도 가입 여부를 결정하기 위해 ON 연산자 후 식을 추가 할 수 있습니다 * 를 해결. 고인 덕분에!

dim query = from order in Orders _ 
Group Join contact in Contacts On order.contactId equals contact.contactId Into grpContacts = Group From gcontact in grpContacts.DefaultIfEmpty() 
Group Join phone in PhoneNumbers On IF(phone is nothing, 0, phone.phoneNumberId) Equals gcontact.homePhoneId Into grpPhoneNumbers = Group from gphone in grpPhoneNumbers.DefaultIfEmpty() 

답변

2

null의 경우 접근 gcontact을 피하기 위해 IIF를 사용해보십시오 :

Equals iif(gcontact is nothing, 0, gcontact.homePhoneId) 
+1

URG,'iff'를 사용하지 않을하시기 바랍니다. 대신에'if'를 사용하십시오. 'if '는 연산자이고, 단락 회로 평가를 제공하기 때문에 일반적으로 iff (함수 임)보다 선호해야합니다. 'gfact.homePhoneId'가 평가 될 것이기 때문에'iff' (항상 그 인자 세 개를 평가합니다)를 사용하면'NullReferenceException'이 던져집니다. – sloth

+0

그랬어! 정말 고맙습니다! 나는 완벽하게 작동하는 Join 절에서 표현식을 사용할 수 있다고 생각하지 않았습니다. 나는 예제를 보여주기 위해 질문을 업데이트 할 것이다. – Kris