본문 바로가기

C# 문법

[C#] Linq에서 Join을 이용하여 데이터 결합하기(질의 문)

Inner Join

  • 내부 조인(Inner Join)은 교집합과 비슷합니다. 두 데이터의 특정 필드를 비교해서 일치하는 데이터만 모아서 반환합니다.

Inner Join 질의 문 형식 (비교 조건이 1개일 경우)

public void Run()
{
    var peopleList = new People[]
    {
        new People() {Name = "양뱅", Age = 33, City = "수원"},
        new People() {Name = "추남", Age = 33, City = "군포"},
        new People() {Name = "쏭", Age = 33, City = "서울"},
        new People() {Name = "쩌주", Age = 33, City = "서울"},
        new People() {Name = "털", Age = 33, City = "서울"},
    };
    var DetailList = new DetailInfo[]
    {
        new DetailInfo() {Name = "양뱅", City= "수원", BloodType = "O"},
        new DetailInfo() {Name = "추남", City= "서울", BloodType = "B"},
        new DetailInfo() {Name = "쏭", City= "서울", BloodType = "A"},
        new DetailInfo() {Name = "쩌주", City= "서울", BloodType = "O"},
        new DetailInfo() {Name = "털", City= "서울", BloodType = "B"},
    };

    //한 개의 조건이 같을 경우 Join 하는 방법
    //Inner Jon => 해당 조건이 무조건 일치해야지만 값이 나온다!
    //TFirst(PeopleList), TSecond (DetailList)
    //TFirst => TFirst.Name 은 PeopleList의 매칭 조건
    //TSecond => TSecond.Name 은 DetailList 매칭 조건
    // (x, y) => new {} 두 데이터의 결합된 결과를 반환하는 값
    peopleList.Join(DetailList,
        TFirst => TFirst.Name,
        TSecond => TSecond.Name,
        (x, y) => new {
            Name = x.Name,
            Age = x.Age,
            City = x.City,
            BloodType = y.BloodType
        })
        .AsParallel()
        .ForAll(f =>
        {
            Console.WriteLine($"이름 : {f.Name}, 나이 : {f.Age}, 혈액형 : {f.BloodType}, 도시 : {f.City}");
        });
}
private class People
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string City { get; set; }
}
private class DetailInfo
{
    public string Name { get; set; }
    public string City { get; set; }
    public string BloodType { get; set; }
}

결과

이름 : 양뱅, 나이 : 33, 혈액형 : O, 도시 : 수원
이름 : 추남, 나이 : 33, 혈액형 : B, 도시 : 군포
이름 : 쏭, 나이 : 33, 혈액형 : A, 도시 : 서울
이름 : 쩌주, 나이 : 33, 혈액형 : O, 도시 : 서울
이름 : 털, 나이 : 33, 혈액형 : B, 도시 : 서울

다중 컬럼이 일치하는 경우

public void Run()
{
    var peopleList = new People[]
    {
        new People() {Name = "양뱅", Age = 33, City = "수원"},
        new People() {Name = "추남", Age = 33, City = "군포"},
        new People() {Name = "쏭", Age = 33, City = "서울"},
        new People() {Name = "쩌주", Age = 33, City = "서울"},
        new People() {Name = "털", Age = 33, City = "서울"},
    };
    var DetailList = new DetailInfo[]
    {
        new DetailInfo() {Name = "양뱅", City= "수원", BloodType = "O"},
        new DetailInfo() {Name = "추남", City= "서울", BloodType = "B"},
        new DetailInfo() {Name = "쏭", City= "서울", BloodType = "A"},
        new DetailInfo() {Name = "쩌주", City= "서울", BloodType = "O"},
        new DetailInfo() {Name = "털", City= "서울", BloodType = "B"},
    };

    //다중 조건이 같을 경우 Join 하는 방법
    //TFirst(PeopleList), TSecond (DetailList)
    //TFirst => new { TFirst.Name, TFirst.City } 은 PeopleList의 매칭 조건
    //TSecond => new { TSecond.Name, TSecond.City } 은 DetailList 매칭 조건
    // (x, y) => new {} 두 데이터의 결합된 결과를 반환하는 값
    peopleList.Join(DetailList,
        TFirst => new { TFirst.Name, TFirst.City },
        TSecond => new { TSecond.Name, TSecond.City },
        (x, y) => new {
            Name = x.Name,
            Age = x.Age,
            City = x.City,
            BloodType = y.BloodType
        })
        .AsParallel()
        .ForAll(f =>
        {
            Console.WriteLine($"이름 : {f.Name}, 나이 : {f.Age}, 혈액형 : {f.BloodType}, 도시 : {f.City}");
        });
}
  • 다중 컬럼 Join의 특징으로는 두개의 필드의 이름이 동일해야 매칭을 할 수 있습니다.

결과

이름 : 쏭, 나이 : 33, 혈액형 : A, 도시 : 서울
이름 : 양뱅, 나이 : 33, 혈액형 : O, 도시 : 수원
이름 : 쩌주, 나이 : 33, 혈액형 : O, 도시 : 서울
이름 : 털, 나이 : 33, 혈액형 : B, 도시 : 서울
  • 추남이의 Detail 정보의 City가 달라 Join이 되지 않은 것을 알 수 있습니다.