기본 패턴
csharp
var result = players
.Join(
teams,
player => player.TeamId,
team => team.Id,
(player, team) => new { player.Name, TeamName = team.Name })
.GroupBy(item => item.TeamName)
.Select(group => new
{
Team = group.Key,
Members = group.Select(item => item.Name).ToList()
});설명
- LINQ의 진짜 힘은 단순 필터링보다 "여러 데이터 소스를 연결하고, 묶고, 원하는 결과 모양으로 투영한다"는 데 있습니다. 이때 핵심이
Join,GroupBy, projection입니다. Join은 두 시퀀스를 키 기준으로 연결합니다. SQL과 비슷하게 읽을 수 있지만, 실제로는 컬렉션 연산이므로 언제 메모리에서 수행되는지와 비용도 함께 생각해야 합니다.GroupBy는 키 기준으로 여러 항목을 묶어 그룹 단위로 다루게 해 줍니다. 집계뿐 아니라 "팀별 멤버 목록", "상태별 항목 묶음"처럼 계층적 결과를 만들 때도 자주 쓰입니다.- projection은
Select로 결과 모양을 재설계하는 과정입니다. 원본 객체를 그대로 끌고 가기보다, 지금 단계에 필요한 데이터만 새 익명 타입이나 DTO로 바꾸는 감각이 중요합니다. - 이 세 가지를 같이 이해하면 LINQ는 단순 문법이 아니라 "데이터를 단계적으로 재구성하는 언어"처럼 보이기 시작합니다. 그래서 컬렉션 처리와 보고서용 데이터 가공이 훨씬 자연스러워집니다.
빠른 정리
| 연산 | 역할 |
|---|---|
Join | 두 시퀀스 연결 |
GroupBy | 키 기준 묶기 |
Select | 결과 모양 재설계 |
| projection | 필요한 데이터만 새 형태로 내보내기 |
| 잘 맞는 곳 | 리포트, 화면 모델, 집계 데이터 |
주의할 점
LINQ 체인이 길어질수록 원본 타입과 현재 결과 타입이 계속 바뀝니다. projection 단계마다 "지금 결과가 어떤 모양인가"를 의식하지 않으면 쿼리가 짧아 보여도 읽기가 급격히 어려워질 수 있습니다.
참고 링크
2 sources