300x250

LINQ에서 두 개의 리스트를 연결할 일이 생기면 Join()을 자주 쓰게 된다.
근데 처음 쓰면 조금 헷갈리고, null 오류도 은근 자주 난다. 그래서 정리해봤다.
📚 목차
- Join 기본 구조
- 사용자 + 주문 예제
- null 오류와 에러 메시지
- Left Join 구현
- Join 주의사항 요약
- 마무리
1. Join 기본 구조
Join은 이렇게 생겼다:
var 결과 = 컬렉션1.Join(
컬렉션2,
x => x.기준값,
y => y.기준값,
(x, y) => 새로운형태
);
- 기준값: 두 리스트를 연결할 공통 키 (예: Id)
- 새로운형태: 조인된 두 항목을 조합한 결과 (보통 익명 타입)
여기까지는 괜찮은데, 문제는 조건이 안 맞거나 값이 없을 때다.
2. 사용자 + 주문 예제
이 예제는 자주 쓰인다. 사용자 ID를 기준으로 주문 정보와 붙여보기:
var users = new List<User>
{
new User { Id = 1, Name = "홍길동" },
new User { Id = 2, 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 = 3, Product = "키보드" } // 없는 사용자
};
var result = users.Join(
orders,
u => u.Id,
o => o.UserId,
(u, o) => new { u.Name, o.Product }
).ToList();
foreach (var item in result)
{
Console.WriteLine($"{item.Name}님이 {item.Product} 주문함");
}
출력 결과:
홍길동님이 노트북 주문함
홍길동님이 마우스 주문함
→ 김영희는 주문이 없고, 주문 3번은 사용자와 매칭되지 않아 누락된다.
3. null 오류와 에러 메시지
값이 없을 때 조심해야 할 에러는 이거다:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
var user = users.FirstOrDefault(x => x.Id == 3); // null
Console.WriteLine(user.Name); // ❌ 여기서 에러
이럴 땐 아래 방법 중 하나 써야 한다:
- 널 조건 연산자 ?. → user?.Name
- 조건문으로 체크 → if (user != null)
4. Left Join 구현
LINQ의 기본 Join은 Inner Join이다. 즉, 한쪽에 없으면 결과에서 빠진다.
Left Join처럼 쓰고 싶으면 이렇게:
var leftJoin = users.GroupJoin(
orders,
u => u.Id,
o => o.UserId,
(u, os) => new { u.Name, Orders = os.DefaultIfEmpty() }
)
.SelectMany(
x => x.Orders,
(user, order) => new { user.Name, Product = order?.Product ?? "주문 없음" }
).ToList();
홍길동 - 노트북
홍길동 - 마우스
김영희 - 주문 없음
→ DefaultIfEmpty()가 핵심이다. 없으면 null이 들어오고, 그걸 처리해주는 구조.
5. Join 주의사항 요약
- 기본 Join = Inner Join → 누락 발생 가능
- null 에러 자주 발생 → 조건문이나 ?. 필수
- 키 값 타입 불일치 조심 (int vs string 같은 거)
- Left Join은 GroupJoin + DefaultIfEmpty()
6. 마무리
Join은 정말 많이 쓰이지만, 한 번쯤 null 오류 늘 확인해둘 것! 오늘은 기본 구조부터, 예제, 그리고 실제 오류 상황까지 정리해봤고
다음 편에선 GroupJoin과 Left Join 응용을 이어서 정리해보려 한다.
300x250