개발꿈나무
[Linq] - Group by + Join (+ Case when~ then) 본문
[C#] Linq - Group by
Group by 내가 필요했던 쿼리는 최근 며칠동안의 생성날짜(created_date)별 DCN의 갯수이다. created_date는 날짜뿐만 아니라 시간까지 저장되어 있다. 그래서 created_date.ToString("yyyyMMdd")를 통해 날짜만..
hyokye0ng.tistory.com
지난 포스팅에서 Group by, Join에 대해 알아보았다.
이번에는 Group by를 수행한 테이블과 다른 테이블을 Join해보자!
Groupby + Join
최종적으로 내가 필요한 쿼리는 GroupBy를 수행한 테이블과 다른 테이블을 Join하는 것이었다.
처음에는 GroupBy를 먼저 수행하려고 했다가 엄청난 삽질을 했다.
결국 내가 찾아낸 로직은 Join을 먼저 수행하고 Join된 테이블에 대해 Groupby를 수행하는 것이다.
from a in (Join 수행한 테이블) group by ~
이런 식으로 Join을 수행한 테이블에 대해 group by를 수행했다.
sql로 따지자면 where절에 서브쿼리를 집어넣은 것으로 이해할 수 있을 것 같다.
private List<DateDct> QueryFunc(DateTime days_ago, IEnumerable<W_DCN> dcns, IEnumerable<W_DCT> dcts)
{
var query = (from a in (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
})
group a by a.date into GroupBy
orderby GroupBy.Key
select new DateDct
{
C_Date = GroupBy.Key,
Cnt = GroupBy.Where(f => f.dct_no != "").Count(),
Color = GroupBy.Where(f => f.dct.STATUS != "ReleaseSuccess").Count() > 0 ? "#54AFFD" : "#D7EDFF",
Dct = GroupBy.Select(f => f.dct).ToList()
}).ToList();
return query;
}
public class DateDct
{
public string C_Date { get; set; }
public int Cnt { get; set; }
public string Color { get; set; }
public IEnumerable<W_DCT> Dct { get; set; }
}
여기서 Case when ~ then ~ 절을 찾아볼 수 있다.
바로 요부분 !
Color = GroupBy.Where(f => f.dct.STATUS != "ReleaseSuccess").Count() > 0 ? "#54AFFD" : "#D7EDFF"
이 코드는 dct의 STATUS가 "ReleaseSuccess"가 아닌 것의 갯수를 count하여
0보다 크다면 color에 "#54AFFD"라는 색상을, 0보다 작거나 같다면 "#D7EDFF"라는 색상을 저장하는 것이다.
즉, dct라는 테이블에 STATUS가 "ReleaseSuccess"인 것이 있다면 #54AFFD, 없다면 #D7EDFF
이처럼 Linq에서 Case when then 절은 다음과 같이 쓸 수 있다.
Cnt = [table].Count() = 1 ? 1 : [table].Count() =2 ? 2 : [table].Count() = 3? 3: 0
count가 1이면? 1, 2이면 2, 3이면 3, 아무것도 아니면 0
'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] - Join (0) | 2021.11.09 |
[Linq] - Group by (0) | 2021.11.08 |