크로스 조인(Cross Join)
크로스 조인은 첫 번째 데이터 집합의 각 요소를 두 번째 데이터 집합의 각 요소와 결합하는데 사용됩니다. 크로스 조인된 결과는 데카르트 곱을 반환하므로 카티전 조인이라고 말합니다.
크로스 조인은 Join 조건이 존재하지 않습니다. 첫 번째 데이터 집합의 요소가 3개, 두 번째 데이터 집합의 요소가 2개 존재한다면 크로스 조인의 결과는 3 x 2로 총 6개의 요소를 가지는 데이터 집합이 반환됩니다.
예를 들어, 두 개의 데이터 집합(Employee, Department)이 존재합니다.
![[C#]LINQ 크로스 조인(Cross Join) - 크로스 조인(Cross Join) [C#]LINQ 크로스 조인(Cross Join) - 크로스 조인(Cross Join)](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
크로스 조인 결과로 총 6개의 요소를 가지는 데이터 집합이 반환됩니다.
![[C#]LINQ 크로스 조인(Cross Join) - 크로스 조인(Cross Join) [C#]LINQ 크로스 조인(Cross Join) - 크로스 조인(Cross Join)](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
샘플 데이터
이번 포스팅에서는 사용자 정의 클래스인 Employee, Department 타입의 데이터 집합을 사용합니다.
[Employee 클래스]
public class Employee {
public string Emp_Code { get; set; } // 사원코드
public string Emp_Name { get; set; } // 사원명
public static List<Employee> GetEmployees()
{
return new List<Employee>()
{
new Employee { Emp_Code = "1", Emp_Name = "홍길동"},
new Employee { Emp_Code = "2", Emp_Name = "호날두"},
new Employee { Emp_Code = "3", Emp_Name = "김첨지"}
};
}
}
![[C#]LINQ 크로스 조인(Cross Join) - 크로스 조인(Cross Join) - 샘플 데이터 [C#]LINQ 크로스 조인(Cross Join) - 크로스 조인(Cross Join) - 샘플 데이터](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
[Department 클래스]
public class Department
{
public string Dept_Code { get; set; } // 부서코드
public string Dept_Name { get; set; } // 부서명
public static List<Department> GetDeptments()
{
return new List<Department>()
{
new Department { Dept_Code = "1000", Dept_Name = "영업"},
new Department { Dept_Code = "2000", Dept_Name = "기획"}
};
}
}
![[C#]LINQ 크로스 조인(Cross Join) - 크로스 조인(Cross Join) - 샘플 데이터 [C#]LINQ 크로스 조인(Cross Join) - 크로스 조인(Cross Join) - 샘플 데이터](http://t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png)
예제 1. 질의 구문
다음 예제는 질의 구문으로 Employee 리스트와 Department 리스트를 크로스 조인합니다.
class Program
{
static void Main(string[] args)
{
var CrossJoinQueryResult = from emp in Employee.GetEmployees()
from dept in Department.GetDeptments()
select new
{
emp,
dept
};
foreach (var item in CrossJoinQueryResult)
{
Console.WriteLine($"사원 코드 : {item.emp.Emp_Code}, 사원명: {item.emp.Emp_Name}" +
$", 부서 코드: {item.dept.Dept_Code}, 부서명: {item.dept.Dept_Name}");
}
}
}
[실행 결과]
사원 코드 : 1, 사원명: 홍길동, 부서 코드: 1000, 부서명: 영업
사원 코드 : 1, 사원명: 홍길동, 부서 코드: 2000, 부서명: 기획
사원 코드 : 2, 사원명: 호날두, 부서 코드: 1000, 부서명: 영업
사원 코드 : 2, 사원명: 호날두, 부서 코드: 2000, 부서명: 기획
사원 코드 : 3, 사원명: 김첨지, 부서 코드: 1000, 부서명: 영업
사원 코드 : 3, 사원명: 김첨지, 부서 코드: 2000, 부서명: 기획
예제 2. 메서드 구문
메서드 구문에서 크로스 조인을 구현하려면 SelectMany() 메서드 또는 Join() 메서드를 사용합니다.
다음 예제는 SelectMany() 메서드를 사용하는 방법입니다.
class Program
{
static void Main(string[] args)
{
var CrossJoinMethodResult = Employee.GetEmployees()
.SelectMany(dept => Department.GetDeptments(),
(emp, dept) => new { emp, dept });
foreach (var item in CrossJoinMethodResult)
{
Console.WriteLine($"사원 코드 : {item.emp.Emp_Code}, 사원명: {item.emp.Emp_Name}" +
$", 부서 코드: {item.dept.Dept_Code}, 부서명: {item.dept.Dept_Name}");
}
}
}
다음 예제는 Join() 메서드를 사용하는 방법입니다.
class Program
{
static void Main(string[] args)
{
var CrossJoinMethodResult = Employee.GetEmployees()
.Join(Department.GetDeptments(),
emp => true,
dept => true,
(emp, dept) => new
{
emp,
dept
}
);
foreach (var item in CrossJoinMethodResult)
{
Console.WriteLine($"사원 코드 : {item.emp.Emp_Code}, 사원명: {item.emp.Emp_Name}" +
$", 부서 코드: {item.dept.Dept_Code}, 부서명: {item.dept.Dept_Name}");
}
}
}
실행 결과는 질의 구문과 동일합니다.
반응형
'C# > LINQ' 카테고리의 다른 글
[C#]LINQ 첫 번째 요소 가져오기 - First, FirstOrDefault 메서드 (0) | 2022.08.07 |
---|---|
[C#]LINQ 특정 인덱스의 값 가져오기 - ElementAt, ElementAtOrDefault 메서드 (0) | 2022.08.07 |
[C#]LINQ 왼쪽 조인(Left Join) (0) | 2022.08.06 |
[C#]LINQ 그룹 조인 - GroupJoin 메서드 (0) | 2022.08.06 |
[C#]LINQ 내부 조인(Inner Join) - Join 메서드 (0) | 2022.08.06 |
댓글