반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

개발꿈나무

[Linq] - Join 본문

C#/LINQ

[Linq] - Join

HYOKYE0NG 2021. 11. 9. 15:03
반응형
 

[C#] Linq - Group by

Group by 내가 필요했던 쿼리는 최근 며칠동안의 생성날짜(created_date)별 DCN의 갯수이다. created_date는 날짜뿐만 아니라 시간까지 저장되어 있다. 그래서 created_date.ToString("yyyyMMdd")를 통해 날짜만..

hyokye0ng.tistory.com

이전 포스팅에서 Group by에 대해 알아보았다.

이번에는 Join에 대해 알아보자!

 

 

Join

 

가장 기본적인 Join은 다음과 같다.

A와 B를 id라는 컬럼을 기준으로 조인하여 join_group에 저장하는 코드이다.

var query = from a in A
			join b in B
            on a.id equals b.id into join_group
            select new
            {
            	join_group.id
            };

 

<Left Outer Join>

내가 원하는 Join 쿼리는 Outer Join이 필요했는데, 찾아보니 Linq에서는 Left Outer Join만 지원한다고 한다.

Left Outer Join을 사용하는 방법은 일반 Join과 동일하지만 Join후

from join_group in [join_result].DefaultIfEmpty()을 추가해주면 된다.

 

그리고, left outer join에서 A left outer join B라고 가정한다면,

join 결과는 B의 데이터를 기준으로 저장되며

A의 데이터을 사용하고 싶다면 그냥 A.column명 으로 사용하면 된다.

아 물론 join결과는 B를 기준으로 하기 때문에 null인 데이터가 있음을 고려하여 select절에서 체크해주어야 한다.

private List<DateDct> QueryFunc(DateTime days_ago, IEnumerable<W_DCN> dcns, IEnumerable<W_DCT> dcts)
{
	var query = from dcn in dcns.Where(f => Convert.ToInt32(f.CREATED_DATE.ToString("yyyyMMdd")) >= Convert.ToInt32(days_ago.ToString("yyyyMMdd")))
				join dct in dcts.Where(f => Convert.ToInt32(f.CREATED_DATE.ToString("yyyyMMdd")) >= Convert.ToInt32(days_ago.ToString("yyyyMMdd")))
				on dcn.DCN_NO equals dct.DCN_NO into Join_Group
				from join_group in Join_Group.DefaultIfEmpty()
				select new
				{
					dcn_no = dcn.DCN_NO,
    				dct_no = join_group?.DCT_NO?? "",
    				date = dcn.CREATED_DATE.ToString("yyyyMMdd"),
    				dct = join_group
				});
    
    return query;
}
반응형
Comments