8장 - C# 3.0 - 3

2015. 1. 12. 00:18IT Books/시작하세요 C# 프로그래밍

LINQ

(Language Integrated Query)


데이터 열거 작업은 프로그래밍 작업시 빈번히 발생.

이 작업을 일관되게 표현하는 문법체계.


전형적으로 컬렉션을 대상으로 쿼리 수행.



 

LINQ에서 추가된 from, in, select 예약어가 코드에 있다.

이 구문은 다음과 같이 생각하면 쉽게 이해할 수 있다.

from person in people -----> foreach (var person in people)
select person           -----> yield return person
yield return 구문이 IEnumerable<T>를 반환하므로
코드에서 all 변수에 담긴 형식이 IEnumerable<Person> 인 것을 알 수 있다.

더 나아가면 엄밀히 따져 LINQ 쿼리도 컴파일러의 '간편 표기법'이나 다름없다.
IEnumerable<Person> all = people.Select((elem) => elem);

C# 3.0의 새로운 문법들은 LINQ와 혼용되어 사용되는데
마소에서 LINQ를 도입하기 위해 
var
객체 초기화
익명 타입
람다 식
확장 메서드
를 넣을 수 밖에 없었던 것이다.


where, orderby, group by, join

SQL 쿼리의 SELECT * FROM people WHERE 에 해당하는 코드는 다음과 같다.



LINQ는 where 구문을 통해 IEnumerable<T> 타입인 people 컬렉션에서 특정 조건 만족여부를 필터링 할 수 있다.
where 절의 조건에서 bool형만 만족하면 어떤 c# 코드도 사용가능하다.


SELECT * FROM people ORDER BY 에 해당하는 코드는 다음과 같다.


orderby를 이용하면 정렬이 수행되고 descending을 이용하여 내림차순 정렬이 가능하다.
orderby에 올 수 있는 값은 IComparable 인터페이스가 구현된 타입이면 된다.



SELECT * FROM people GROUP BY


group by를 이용해 주소별로 그룹핑한다.
LINQ의 group by는 지정된 값을 기준으로 컬렉션의 요소를 그룹으로 분류.
다만 select문은 올 수 없다. (group by의 기능이 select와 동일한 기능을 하기 때문)


join


개념적으로는 join을 select로 대체해서 생각하면 이해하기 쉽다.

2개의 컬렉션에서 on ~ equals 조건을 만족하는 요소끼리 묶어 반환한다.



내부 조인 + 외부 조인을 결합했다.

첫번째 조인으로  languages 컬렉션의 내용을 lang이라는 임시 컬렉션으로 보내고 각각의 요소에

IEnumerable<T> 타입의 DefaultIfEmpty 확장 메서드를 호출한다.

이 메서드는 요소 중 값이 비어 있으면 인자로 전달된 new MainLanguage() 를 값으로 사용한다.

'IT Books > 시작하세요 C# 프로그래밍' 카테고리의 다른 글

c# 5.0 - 1  (0) 2015.01.23
9장 - C# 4.0  (0) 2015.01.16
8장 - c# 3.0 - 2  (0) 2015.01.10
8장 - C# 3.0 - 1  (0) 2015.01.06
7장 - c#2.0 - 그외  (0) 2014.12.28