using System;
using System.Collections.Generic;
using System.Linq;
namespace LinqGeneric
{
#region Join
class Join
{
class Department
{
public int Id { get; set; }
public string Name { get; set; }
}
class Sex
{
public int Id { get; set; }
public string Name { get; set; }
}
class Employee
{
public int Id { get; set; }
public string Name { get; set; }
public int DeptId { get; set; }
}
static void Main(string[] args)
{
List<Department> departments = new List<Department>();
departments.Add(new Department { Id = 1, Name = "Account" });
departments.Add(new Department { Id = 2, Name = "Sales" });
departments.Add(new Department { Id = 3, Name = "Marketing" });
List<Sex> sex = new List<Sex>();
sex.Add(new Sex { Id = 0, Name = "남자" });
sex.Add(new Sex { Id = 1, Name = "여자" });
List<Employee> employees = new List<Employee>();
employees.Add(new Employee { DeptId = 0, Type = 2, Id = 1, Name = "William" });
employees.Add(new Employee { DeptId = 2, Type = 2, Id = 2, Name = "Miley" });
employees.Add(new Employee { DeptId = 1, Type = 1, Id = 3, Name = "Benjamin" });
var list = (from e in employees
join d in departments on e.DeptId equals d.Id
select new
{
EmployeeName = e.Name,
DepartmentName = d.Name
});
Console.WriteLine("\n내부 조인(join) :");
//양쪽에 데이터가 일치하여야 표시.
foreach (var e in list)
{
Console.WriteLine("직원명 = {0} , 부서명 = {1}", e.EmployeeName, e.DepartmentName);
}
// Create the query.
var leftOuter =
from e in employees
join d in departments on e.DeptId equals d.Id into deptGroup
select deptGroup.DefaultIfEmpty(new Department() { Name = "Empty", Id = e.DeptId });
Console.WriteLine("\n외부 조인(Outer join) :");
int totalItems = 0;
//LINQ는 왼쪽 조인만을 지원.
//왼쪽의 데이터를 모두 보여 주고 오른쪽 데이터는 없으면 Empty 를 넣어 표시.
foreach (var e in leftOuter)
{
Console.WriteLine("Group:{0,5} ea", e.Count());
foreach (var item in e)
{
totalItems++;
Console.WriteLine("부서명 = {0} , 부서Id = {1}", item.Name, item.Id);
}
Console.WriteLine();
}
Console.WriteLine("LeftOuterJoin: 그룹 {1} 의 아이템 {0} ", totalItems, leftOuter.Count());
//그룹 조인은 결과값이 그룹으로 구성되며, 기본적으로 내부 조인입니다.
//왼쪽 데이터는 모두 있으나 일치 하지 않는 데이터는 제외 표시.
Console.WriteLine("\nGroup Join :");
totalItems = 0;
var groupJoin =
from e in employees
join d in departments on e.DeptId equals d.Id into deptGroup
select deptGroup;
foreach (var e in groupJoin)
{
foreach (var item in e)
{
totalItems++;
Console.WriteLine("부서명 = {0} , 부서Id = {1}", item.Name, item.Id);
}
Console.WriteLine("Group Join: 그룹 {1} 의 아이템 {0} ", totalItems, groupJoin.Count());
Console.WriteLine();
}
// Create the query.
var leftCaseOuter =
from e in employees
join d in departments on e.DeptId equals d.Id into deptGroup
from dd in deptGroup.DefaultIfEmpty(new Department() { Name = "Empty", Id = e.DeptId })
join s in sex on e.DeptId equals s.Id into sexGroup
from rr in sexGroup.DefaultIfEmpty(new Sex() { Name = "Empty", Id = e.DeptId })
select new Employee() { Name = (e.Type.Equals(1) ? dd.Name : rr.Name), Id = e.Id, DeptId = e.DeptId, Type = e.Type };
leftCaseOuter.ToList().ForEach(
row => Console.WriteLine("left Case Join: {0} {1}", row.DeptId, row.Name));
Console.WriteLine("\n아무 키나 누르세요.");
Console.ReadKey();
}
}
#endregion
}
결과
내부 조인(join) :
직원명 = Miley , 부서명 = Sales
직원명 = Benjamin , 부서명 = Account
외부 조인(Outer join) :
Group: 1 ea
부서명 = Empty , 부서Id = 0
Group: 1 ea
부서명 = Sales , 부서Id = 2
Group: 1 ea
부서명 = Account , 부서Id = 1
LeftOuterJoin: 그룹 3 의 아이템 3
Group Join :
Group Join: 그룹 3 의 아이템 0
부서명 = Sales , 부서Id = 2
Group Join: 그룹 3 의 아이템 1
부서명 = Account , 부서Id = 1
Group Join: 그룹 3 의 아이템 2
left Case Join: 0 남자
left Case Join: 2 Empty
left Case Join: 1 Account
아무 키나 누르세요.
SQL
-- JOIN
SELECT e.Name EmployeeName, d.Name DepartmentName
FROM employees e INNER JOIN departments d
ON e.DeptId = d.Id;
-- LEFT JOIN
SELECT e.Name EmployeeName, d.Name DepartmentName
FROM employees e LEFT OUTER JOIN departments d
ON e.DeptId = d.Id;
--GROUP JOIN
SELECT d.Id DepartmentId, d.Name DepartmentName, COUNT(e.Name) EmployeeCount
FROM Customers e LEFT OUTER JOIN Regions d
ON e.RegionId = d.Id
GROUP BY d.Id, d.Name;
'트레이닝' 카테고리의 다른 글
블레이저 앱 개발을 위한 환경 설정 (0) | 2021.02.15 |
---|---|
블레이저란 무엇인가? (0) | 2021.02.14 |
Where 쿼리 (0) | 2020.07.08 |
쿼리 연산자 (0) | 2020.07.08 |
라우팅. (0) | 2020.07.08 |