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이 되지 않은 것을 알 수 있습니다.