본문 바로가기
Programming/C#

c#_12 : LINQ , JOIN

by 공부합시다홍아 2020. 6. 12.

LINQ

LINQ ( Language INtergrated Query ) 는 뭔가에 대해 물어본다는 뜻입니다. 데이터 질의라고 하면 데이터에 대해 물어본다는 말이 됩니다. 그렇다면 그 질문을 받은 누군가는 데이터에 대한 답변을 준다. 

  • From : 어떤 데이터 집합에서 찾을 것인가?

  • Where : 어떤 값의 데이터를 찾을 것인가?

  • Select : 어떤 항목을 추출할 것인가?

 

  1. FROM 

     : 모든 LINQ 쿼리식은 반드시 From 절로 시작합니다. 쿼리식의 대상이 될 데이터 원본과 데이터 원본 안에 들어 있         는 각 요소 데이터를 나타내는 범위 변수를 from절에서 지정해줘야합니다. 이때 from의 데이터 원본은 아무 형식         이나, 사용할 수 없고 IEnumerable<T> 인터페이스를 상속하는 형식이여 합니다. 범위 변수는 쿼리 변수라고도 하         는데, foreach 문의 반복 변수를 생각하면 이해가 쉽다. 

        foreach(int x in arr )에서 x와도 같은 것입니다.

  • LINK의 범위 변수의 foreach의 반복 변수의 차이점

      : foreach의 반복 변수는 데이터 원본으로부터 데이터를 담아내지만, 범위 변수는 실제로 데이터를 담지는 않습니           다. 그래서 쿼리식 외부에서 선언된 범위 변수의 데이터를 복사해 넣는다던가 하는 일은 할 수 없습니다. 범위 변           수는 오로지 LINQ 질의 안에서만 통용되며, 질의가 실행될 때 어떤 일이 일어날지를 묘사하기 위해 도입됐다.

     -    From 절의 선언 방법 

           from <범위 변수> in <데이터 원본>

where 절

where절은 한마디로 필터(Filter)역할을 하는 연산자입니다. from절이 데이터 원본으로 부터 뽑아낸 범위 변수가 가져야 하는 조건을 where 연산자에 매개 변수로 입력하면 LINQ는 해당 조건에 부합하는 데이터만을 걸러냅니다. 

 

orderby 

orderby는 데이터의 정렬을 수행하는 연산자입니다. 기본적으로 오름차순으로 데이터를 정렬하지만, 내림차순으로 정렬 할 때는 orderby ~ descending을 이용하면 된다.

 

select 절

select 절은 최종 결과를 추출하는 쿼리식의 마침표 같은 존재이다. from절에서 데이터 원본으로 부터 범위 변수를 뽑아내고 where절에서 이 범위 변수의 조건을 검사한 후, 그 결과를 orderby절에서 정렬하고 select 문을 이용해서 최종 결과를 추출해내는 것입니다. 

 ※ var 형식으로 선언

var형식을 LINQ쿼리식의 반환할 결과 형식에 맞춰 알아서 컴파일해주기는 하지만, 실제로 var가 어떤 형식으로 치환되는 지를 우리는 알아둘 필요가 있습니다.

LINQ절의 결과는 IEnumerable<T>로 반환되는데, 이 때 형식 매개 변수 T는 바로 지금 사용하는 select문에 의해 결정된다.

 

여러 개의 데이터 원본에 질문하기 

 

Group by로 데이터 분류하기

어떤 것을 특정 기준에 따라 나누어 정리하는 것이 생물학에서만 유용한 것은 아닙니다. 잘 정리된 분류 기준은 데이터를 다루는 사람들에게도 아주 훌륭한 도구입니다. 컴퓨터 프로그램이 이 분류 기준에 따라 데이터를 그룹화해준다면, 이 사람들은 더할 나위 없이 좋아할 것입니다. LINQ 질의식은 이 멋진 작업을 group by 절을 사용합니다.

group by 절 선언 법

  • group A by B into C

 

두 데이터 원본을 연결하는 JOIN 

JOIN은 두 데이터 원본을 연결하는 연산입니다. 막무가내로 연결하는 것은 아니고, 각 데이터 원본에서 특정 필드의 값을 비교하여 일치하는 데이터끼리 연결을 수행합니다.

내부 조인 [ Inner Join ]

내부조인은 교집합과 비슷합니다. 두 데이터 원본 사이에서 일치하는 데이터들만 연결한 후 반환합니다. 조금 더 자세히 이야기하면, 내부 조인은 첫 번째 데이터 원본의 데이터를 기준으로해서 이 데이터의 특정 필드와 두 번째 데이터 원본이 갖고 있는 각 데이터의 특징 필드를 비교해서 일치하는 데이터들만 모아 반환합니다. 

예를 들어 두 원본 A,B 중에 각 각 두 개의 필드를 포함하고 있습니다. 이 필드 들 중 하나씩은 데이터가 일치합니다. 그렇게 내부조인은 일치하는 데이터들만 연결하여 사용합니다. 

내부조인은  기존 데이터 원본에는 존재하지만 연결할 데이터 원본에는 존재하지 않는 데이터는 조인 결과에 포함되지 않습니다. 당연히 기준 데이터 원본에는 없지만 연결할 데이터 원본에는 존재하는 데이터의 경우에도 조인 결과에 포함되지 않습니다. 

한편 내부조인 은 다음과 같이 JOIN 절을 통해 수행됩니다. 기준 데이터 a 는 from 절에서 뽑아낸 범위 변수이고, 연결 대상 데이터 b는 join절에서 뽑아낸 변수입니다. join절의 on 키워드는 조인 조건을 수반합니다. 이때 on절의 조인 조건은 "동등"만 허용됩니다. "~보다 작음" , "~보다 큼"같은 비교 연산은 허락되지 않습니다. 기본 연산자 중 하나인 ' == ' 연산자가 아닌 equals라는 키워드가 조인을 위해 사용됩니다.

from a in A

join b in B on a.xxxx equals b.yyyy

 

외부조인 [ Outer Join ]

외부조인은 기본적으로 내부 조인과 비슷하지만, 조인 결과에 기준이 되는 데이터 원본이 모두 포함된다는 점이 다릅니다. 내부 조인에 했을 때는 없었던 데이터가 외부 조인을 했을 때 Title이 비어있는 상태로 조인 결과에 포함됩니다. 이것은 외부 조인이 기준이 되는 데이터 원본의 모든 데이터를 조인 결과에 반드시 포함시키는 특징 때문입니다. 연결할 데이터 원본에 기준 데이터 원본의 데이터와 일치하는 데이터가 없다면 그 부분은 빈 값으로 결과를 채우게 됩니다.

외부 조인을 사용하는 방법은 내부 조인을 사용하는 방법과 크게 차이가 없습니다. 먼저 join 절을 수행한 후 그 결과를 임시 컬렉션에 저장하고, 이 임시 컬렉션에 대해 DefaultIfEmpty 연산을 수행해서 비어 있는 조인 결과에 빈 값을 채워넣습니다. DefaultIfEmpty 연산을 거친 임시 컬렉션에서 from 절을 통해 범위 변수를 뽑아내고, 이 범위 변수와 기준 데이터 원본에서 뽑아낸 범위 변수를 이용해서 결과를 추출합니다.

 

왼쪽 조인 , 오른쪽 조인 그리고 완전 외부 조인

LINQ는 원래 DBMS에서 사용하던 SQL을 본떠 프로그래밍 언어 안에 통합한 것입니다.

LINQ가 SQL가 상당히 닮아 있긴 하지만, SQL은 그 자체로도 커라란 프로그래밍 언어입니다. 지원하는 데이터 형식도 프로그래밍 형식보다 다양하고, 데이터를 다루는 필요한 함수, 연산자 등이 다양하면서도 사용하기 쉽게 설계되어 있습니다. 

외부조인에는 왼쪽 조인, 오른쪽 조인 그리고 완전 외부 조인 이렇게 세 가지가 있습니다.

왼쪽 조인은 왼쪽 데이터 원본을 기준으로 삼아 조인을 수행하고, 오른쪽 조인은 오른쪽 데이터 원본을 기준으로 삼아 조인을 수행합니다. 완전 외부 조인은 왼쪽과 오른쪽 둘 다의 데이터 원본 모두를 기준으로 삼습니다. 

LINQ는 이 세 가지 조인 방식 중에서 왼쪽 조인만을 지원합니다. 

 

728x90