300x250
LINQ에서 데이터를 연결할 땐 Join()
도 있고 GroupJoin()
도 있다.
이번 글에서는 Join vs GroupJoin의 차이점을 알아보려고한다.

📚 목차
1. Join 간단 요약
2. GroupJoin 간단 요약
3. 예제
4. 언제 무엇을 쓸까?
5. 마무리
1. Join 간단 요약
Join()
은 두 리스트를 특정 키로 연결해서 1:1로 붙여주는 구조다. SQL의 Inner Join과 같다.
var result = A.Join(
B,
a => a.Key,
b => b.Key,
(a, b) => new { ... }
);
- 결과는 한 줄씩 평평하게(flat) 출력
- 공통 키가 있어야만 결과에 포함됨 (Inner Join)
2. GroupJoin 간단 요약
GroupJoin()
은 한 항목(1)에 여러 항목(N)이 연결되는 구조일 때 사용한다.
고객 1명에 주문 여러 개가 연결될 때 = 대표적인 1:N 관계
var result = A.GroupJoin(
B,
a => a.Key,
b => b.Key,
(a, bList) => new { a, bList }
);
- 하위 목록 포함한 중첩 결과
- Left Join처럼 "없어도 포함" 가능
3. 예제로 보는 차이 (출력 포함)
다음은 동일한 데이터로 Join
과 GroupJoin
을 각각 적용한 예제다.
var users = new List<User>
{
new User { Id = 1, Name = "홍길동" },
new User { Id = 2, Name = "김영희" },
new User { Id = 3, Name = "이철수" }
};
var orders = new List<Order>
{
new Order { OrderId = 1, UserId = 1, Product = "노트북" },
new Order { OrderId = 2, UserId = 1, Product = "마우스" },
new Order { OrderId = 3, UserId = 2, Product = "키보드" }
};
🔹 Join 사용
var result = users.Join(
orders,
u => u.Id,
o => o.UserId,
(u, o) => new { u.Name, o.Product }
);
홍길동 - 노트북
홍길동 - 마우스
김영희 - 키보드
✔ 사용자와 주문이 1:1로 평평하게 이어짐
❌ 주문이 없는 이철수는 결과에 없음
🔹 GroupJoin 사용
var result = users.GroupJoin(
orders,
u => u.Id,
o => o.UserId,
(u, os) => new { u.Name, Orders = os }
);
홍길동:
- 노트북
- 마우스
김영희:
- 키보드
이철수:
- (없음)
✔ 1명 사용자당 주문이 하위 리스트로 묶임
✔ 주문이 없어도 항목은 결과에 포함
4. 언제 무엇을 쓸까?
- 그냥 연결하고 싶다 →
Join()
- 하위 항목 리스트까지 포함하고 싶다 →
GroupJoin()
- 값이 없어도 포함하고 싶다 (Left Join 느낌) →
GroupJoin + DefaultIfEmpty()
결과가 중첩되면 펼치기 위해 SelectMany()
를 같이 쓴다.
5. 마무리
Join과 GroupJoin은 구조가 꽤 다르지만, 비교해보면 쉽게 감이 온다.
Join()
: 쌍으로 붙이기, 평평한 결과GroupJoin()
: 그룹으로 묶기, 리스트 안 리스트 구조
다음 편에선 GroupJoin 이후 자주 따라오는 SelectMany()도 정리해보자!
300x250