C#/LINQ

[C#]LINQ 크로스 조인(Cross Join)

DevStory 2022. 8. 7.

크로스 조인(Cross Join)

크로스 조인은 첫 번째 데이터 집합의 각 요소를 두 번째 데이터 집합의 각 요소와 결합하는데 사용됩니다. 크로스 조인된 결과는 데카르트 곱을 반환하므로 카티전 조인이라고 말합니다.

 

크로스 조인은 Join 조건이 존재하지 않습니다. 첫 번째 데이터 집합의 요소가 3개, 두 번째 데이터 집합의 요소가 2개 존재한다면 크로스 조인의 결과는 3 x 2로 총 6개의 요소를 가지는 데이터 집합이 반환됩니다.

 

예를 들어, 두 개의 데이터 집합(Employee, Department)이 존재합니다.

[C#]LINQ 크로스 조인(Cross Join) - 크로스 조인(Cross Join)

크로스 조인 결과로 총 6개의 요소를 가지는 데이터 집합이 반환됩니다.

[C#]LINQ 크로스 조인(Cross Join) - 크로스 조인(Cross Join)


샘플 데이터

이번 포스팅에서는 사용자 정의 클래스인 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) - 샘플 데이터

[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) - 샘플 데이터


예제 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}");
    }
  }
}

실행 결과는 질의 구문과 동일합니다.

반응형

댓글