GroupJoin을 이용한 Outer Join

두개의 DataTable을 Join을 하면 일반적으로 Inner Join 결과를 리턴합니다.
그런데 Outer Join 결과가 필요할때는 Join 함수 만으로 처리 하기 힘듦니다.
이때 GroupJoin을 사용하여 처리 할 수 있습니다.
포럼에 올라온 내용중 Dt1, Dt2에 invoice 와 value 두개의 컬럼을 가지고 있다고 가정하고
Dt2에 Dt1의 invoice 가 있을 경우는 value 값을 Dt1의 value 값을 마이너스한 값으로 대체하고
없을 경우 추가하여 새로운 테이블을 만들어야 할 경우 어떻게 해야 되느냐는 질문이
올라와 있는데 이런경우 GroupJoin을 사용하여 아래와 같이 할 수 있습니다.

Dt1
invoice | value
1       | 100
2       | 100
3       | 100
4       | 100
5       | 100

Dt2
invoice | value
1       | 300
3       | 300

아래의 코드가 새로운 DataTable을 리턴합니다.
Join 된결과가 기준이된 Dt1의 로우와 묶여진 Dt2의 로우의 IEnumerable형태로 이루어 지고
세번째 Functioin에 전달되는데 이때 두번째 값으로 전달된 내용이 Dt1 기준으로 값이 없을 경우
DefaultIfEmpty 파라미터로 대체되어 처리됩니다.

dt1.AsEnumerable.GroupJoin(dt2.AsEnumerable,
	Function(r1) r1("invoice"),
	Function(r2) r2("invoice"),
	Function(k,vs) vs.DefaultIfEmpty(k).
		Select( 
			Function(r)
				r("value") = If(vs.Contains(r),
						(Integer.Parse(r("value").ToString) -
							Integer.Parse(k("value").ToString)).ToString,r("value")
					)
				Return r
			End Function
		)
	).
	SelectMany(Function(r) r).CopyToDataTable

결과
invoice | value
1       | 200
2       | 100
3       | 200
4       | 100
5       | 100