개발꿈나무
[Linq] - Join 본문
반응형
[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;
}
반응형
'C# > LINQ' 카테고리의 다른 글
[Linq] GROUP BY - Week of YEAR (주별 group by) 2 - Monday To Sunday (0) | 2021.12.07 |
---|---|
[Linq] GROUP BY - Week of YEAR (주별 group by) (0) | 2021.12.01 |
[Linq] - Group by + Join (+ Case when~ then) (0) | 2021.11.10 |
[Linq] - Group by (0) | 2021.11.08 |
Comments