LinQ

사용처
컬랙션, 데이터베이스,XML등 데이터 소스에 쿼리 문법을 적용할 수 있다
가독성 향상
컬랙션을 처리 하려면 foreach나 다른 루프나 조건문으로 순회 하면서 코드를 입력해야 하는데
선언적인 방식으로 코드가 간결해지고 읽기 쉬워집니다
지연실행
linq는 결과가 필요할 때까지 실행되지 않습니다
foreach처럼 결과 값을 사용할 때 실행되게 되어 성능 최적화와 효율적인 자원 사용을 가능하게 만듭니다
retsult로 받는 부분이 선언
foreach를 하게 되면 실행하게 됩니다
문법 종류

쿼리를 사용하는 문법 종류는 쿼리 구문과 메서드 체인 방식 총 2가지가 있습니다
쿼리 구문은 구문에 사용할 매개변수 이름을 정하는 from과 결과 값을 정하는 select를 필수적으로 추가해야합니다
메서드 체인 방식은 람다식을 사용하기 때문에 매개변수는 식마다 정하며 select는 생략 가능합니다
해당 게시물에는 LinQ를 메서드 체인 형식으로 사용하며 컬랙션( list, array)에 사용하는 것을 설명합니다
메서드 체인 형식은 람다식을 사용하게 됩니다
LinQ 쿼리 구문 키워드
| 키워드 | 용도 |
| where | 필더링 지정 |
| select | 결과 반환 |
| orderby - descending, ascending ( thenby ) | 정렬기준 - 내림차순 , 올림차순 (정렬 추가) |
| groupby | 그룹화 |
| join | 데이터 소스 결합 |
| let | 쿼리 내 임시 변수 정의 |
where


where는 매개변수(x)는 인덱스에 있는 데이터 이며, 식의 값이 참인 인덱스에 있는 정보만을 가져와 임시 저장소에 저장합니다
select

select는 LinQ를 사용하여 필터링하거나 정렬된 데이터를 최종적으로 어떤 형태의 결과로 변환할지 정의합니다
가공전의 리스트는 int형 이었지만 데이터와 문자열을 함께 하용하여 최종적으로 문자열 형태로 필터링되었습니다
orderby


orderby는 기본적으로 데이터를 올림 차순으로 정렬합니다.
내림차순으로 사용하려면 OrderByDescending()을 대신 사용합니다
LinQ를 사용하여 임시 저장소에 저장 된 데이터들을
orderby에 의해 데이터를 순서대로 정리해 놓습니다
----

나열한 뒤에 추가로 나열된 것 중에 또 나열을 하고 싶다면 thenby를 사용
orderby(x=>x.a).thenby(x=>x.b);
계속 정렬 기준이 필요하다면 thenby를 추가로 붙이면 된다
groupby


groupby는 식에 있는 값을 모아 그룹화 합니다
첫번째 이미지
그룹에 들어가는 요소(I1)와 같은 값을 가진 I1 인덱스를 모아 그룹을 형성합니다
해당 이미지의 I1속성의 값이 5와 8이 존재하기 때문에, 그룹 이름은 5와 8 총 2가지 그룹이 생기게 되며
그 그룹(5,8)은 Key가 됩니다
두번째 이미지
그룹을 foreach로 순회하게 되면 그룹이 가지고 있는 요소를 보여주게됩니다
첫 번째 foreach는 키(5와 8)를 순회하게 되고
두 번째 foreach에서 키에 있는 요소들을 순회하게 됩니다

select를 사용하면 데이터를 한 눈에 볼 수 있게 변경해줍니다
select를 사용하여 그룹 -> string으로 변경하였기 때문에 더이상 그룹이 아니게 됩니다
그렇기 때문에 안에 요소들은 foreach로 순회가 되지 않습니다

groupby는 요소를 정하기 때문에 다른 데이터 타입을 사용해도 가능합니다
join

join은 같은 요소 타입을 가지고 있는 두 개의 컬랙션의 같은 요소들을 합쳐줍니다
인수는 최소 4개 최대 5개를 가지게 됩니다
| 인수 위치 | 기능 |
| 1 | 결합할 외부 컬랙션 |
| 2 | 외부 컬랙션 요소 |
| 3 | 내부 컬랙션 요소 |
| 4 | 조인에 성공한 요소들로 원하는 결과를 반환 |
| 5 | 비교 방식 재정의 |
2 번째와 3번째 요소의 타입은 동일해야 하며, 두 컬랙션드링 가진 요소의 개수가 동일하지 않을 경우
마지막으로 가진 값으로 연결됩니다
new { _string = 요소 1 , _string = 요소 2 }
new { _st = 요소 1 , _st =요소 2 , _st = 요소 3 , _st = 요소 4}
(요소 1)(요소 1)
(요소 2)(요소 2)
(요소 2)(요소 3)
(요소 2)(요소 4)
linQ는 인덱스를 사용하지 않기 때문에 join의 결과는 순서를 보장하지 않습니다
join을 사용할 시 요소들을 연결해 놓기만 하기 떄문에
정렬을 원하시면 group을 사용하여 정렬이 가능합니다
let
메서드 체인에서는 사용하지 않고 쿼리 구문에서 사용합니다
쿼리 구문 내에서 중간에 변수로 값을 저장하여 다른 부분에서 쉽고 효율적이게 재사용하기 위해 사용합니다