Languague/C# / / 2025. 4. 10. 08:00

[C# LINQ] Join vs GroupJoin 차이점

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. 예제로 보는 차이 (출력 포함)

다음은 동일한 데이터로 JoinGroupJoin을 각각 적용한 예제다.

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
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유