INNER JOIN

 

LINQ에서 내부 조인은 기본적으로 두 개의 데이터들 사이에서 일치하는 데이터들만 연결시켜 반환합니다. 첫 번째 데이터를 기준으로 두 번째 데이터를 equals를 사용해 비교하여 일치하는 데이터들을 모아 반환합니다.

 

var InnerJoin =
	from a in A
    	join b in B a.variables equals b.variables

 

A라는 데이터 원본에서 a라는 범위 변수를 뽑아오고, 두 번째 B라는 데이터 원본에서 b라는 범위 변수를 뽑아옵니다. 이후, equals에서 두 데이터를 비교하여 일치하는 데이터를 뽑아냅니다.

 

OUTER JOIN

 

외부 조인은 내부 조인과 달리 기준이 되는 데이터는 데이터의 일치 여부와 상관없이 모두 다 포함이 됩니다. 대신 일치하지 않는 데이터가 없는 경우에는 그 부분을 빈 값으로 처리하고, 임시 컬렉션에서 DefaultIsEmpty 연산을 통해 빈 값을 채워 줄 수 있습니다.

 

var OuterJoin =
	from a in A
    	join b in B a.variables equals b.variables into data
        from b in data.DefaultIfEmpty(new Class() { 데이터 삽입 })

 

실습

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Join
{
    struct Idol
    {
        public string name { get; set; }
        public string groupName { get; set; }

        public int age { get; set; }
        public int height { get; set; }

        public Idol(string _name, string _groupName, int _age, int _height)
        {
            name = _name;
            groupName = _groupName;
            age = _age;
            height = _height;
        }
    }

    struct Star
    {
        public string name { get; set; }
        public string team { get; set; }
 
        public int age { get; set; }
        public int height { get; set; }


        public Star(string _name, int _age, int _height, string _team = null)
        {
            name = _name;
            age = _age;
            height = _height;
            team = _team;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Idol[] Izone =
            {
                new Idol("권은비", "아이즈원", 25, 160),
                new Idol("김민주", "아이즈원", 19, 163),
                new Idol("조유리", "아이즈원", 19, 162),
                new Idol("최예나", "아이즈원", 21, 162),
                new Idol("김채원", "아이즈원", 20, 163),
                new Idol("강혜원", "아이즈원", 21, 163),
                new Idol("장원영", "아이즈원", 16, 175),
                new Idol("안유진", "아이즈원", 17, 169),
                new Idol("이채연", "아이즈원", 21, 165),
                new Idol("사쿠라", "아이즈원", 23, 163),
                new Idol("나코",   "아이즈원", 19, 150),
                new Idol("히토미", "아이즈원", 19, 158),
            };

            Star[] AKB48 =
            {
                new Star("사쿠라", 23, 163, "AKB48"),
                new Star("나코", 19, 150, "AKB48"),
                new Star("히토미", 19, 158, "AKB48"),
            };

            /* 내부 조인 */
            var InnerJoinData =
                from profile in Izone
                join item in AKB48 on profile.name equals item.name
                select new
                {
                    Name = profile.name,
                    GroupName = profile.groupName,
                    Age = profile.age,
                    Height = profile.height,
                };

            foreach(var item in InnerJoinData)
            {
                Console.WriteLine("이름 : {0}, \t 그룹 : {1}, \t 나이 : {2}, \t 키 : {3}", item.Name, item.GroupName, item.Age, item.Height);
            }

            Console.WriteLine();

            /* 외부 조인 */
            var OuterJoinData =
                from profile in Izone
                join item in AKB48 on profile.groupName equals item.team into ps
                from item in ps.DefaultIfEmpty(new Star() { team = "IZONE" })
                select new
                {
                    Name = profile.name,
                    Age = profile.age,
                    GroupName = item.team,
                    Height = profile.height,
                };

            foreach (var item in OuterJoinData)
            {
                Console.WriteLine("이름 : {0}, \t 그룹 : {1}, \t 나이 : {2}, \t 키 : {3}", item.Name, item.GroupName, item.Age, item.Height);
            }
        }
    }
}

-----------------------------------------------------------------

이름 : 사쿠라,   그룹 : 아이즈원,        나이 : 23,      키 : 163
이름 : 나코,     그룹 : 아이즈원,        나이 : 19,      키 : 150
이름 : 히토미,   그룹 : 아이즈원,        나이 : 19,      키 : 158

이름 : 권은비,   그룹 : IZONE,   나이 : 25,      키 : 160
이름 : 김민주,   그룹 : IZONE,   나이 : 19,      키 : 163
이름 : 조유리,   그룹 : IZONE,   나이 : 19,      키 : 162
이름 : 최예나,   그룹 : IZONE,   나이 : 21,      키 : 162
이름 : 김채원,   그룹 : IZONE,   나이 : 20,      키 : 163
이름 : 강혜원,   그룹 : IZONE,   나이 : 21,      키 : 163
이름 : 장원영,   그룹 : IZONE,   나이 : 16,      키 : 175
이름 : 안유진,   그룹 : IZONE,   나이 : 17,      키 : 169
이름 : 이채연,   그룹 : IZONE,   나이 : 21,      키 : 165
이름 : 사쿠라,   그룹 : IZONE,   나이 : 23,      키 : 163
이름 : 나코,     그룹 : IZONE,   나이 : 19,      키 : 150
이름 : 히토미,   그룹 : IZONE,   나이 : 19,      키 : 158
블로그 이미지

NIA1995

,