LINQ 란

2022. 1. 31. 00:00CSharp/Advance

반응형

소개

 

쿼리 는 데이터 소스에서 데이터를 검색하는 식이다.  쿼리는 일반적으로 특수화된 쿼리 언어로 표현된다.

LINQ 는 다양한 데이터 소스 및 형식 (XML, SQL, ADO.NET dataset, Collection 및 LINQ provider 를 지원하는 모든 형식) 에서 일관된 모델을 제공하여 데이터를 쿼리하고 변환하는 데 동일한 기본 코딩 패턴을 사용하는 Query 이다. 

 

쿼리 작업의 단계

: LINQ query 작업은 다음위 세가지 단계를 따른다.

  1. 데이터소스 가져오기
  2. 쿼리 만들기
  3. 쿼리 실행
// The Three Parts of a LINQ Query:
// 1. 데이터 소스 가져오기.
int[] numbers = new int[7] { 3, 0, 4, 5, 1, 6, 2 };

// 2. 쿼리 만들기.
// numQuery is an IEnumerable<int>
var numQuery =
    from num in numbers
    where (num % 2) == 0
    select num;

// 3. 쿼리 실행.
foreach (int num in numQuery)
{
    Console.Write("{0,1} ", num);
}

LINQ Query 의 작업 방식

 

데이터 소스

LINQ Query 를 사용하기 위한 원본 데이터

이전 데이터 소스는 배열 (array) 이기 때문에 제네릭 IEnumerable<T> 인터페이스를 암시적으로 지원한다. 

그러므로 LINQ 로 쿼리 할 수 있다. 

IEnumerable<T> 또는 제네릭 IQueryable<T> 같은 파생된 인터페이스를 지원하는 형식을 쿼리 가능 형식 이라고 한다.

 

쿼리

쿼리는 데이터 소스 또는 소스에서 검색할 정보를 지정

쿼리식은 크게 from 절 where 절 select 절로 이루어진다. 

 

from 데이터소스

where 조건

select 데이터 선택

 

쿼리 실행

 

1. 지연된 실행

: 쿼리 변수 자체는 쿼리 명령을 저장할 뿐  foreach 문에서 쿼리 변수가 반복될 때까지 지연

//  Query execution.
foreach (int num in numQuery)
{
    Console.Write("{0,1} ", num);
}

 

 

2. 즉시 실행

집계 함수

:  집계 함수를 수행하는 쿼리 (Count, Max, Average  First)

var evenNumQuery =
    from num in numbers
    where (num % 2) == 0
    select num;

int evenNumCount = evenNumQuery.Count();

강제 적용

: ToList 또는 ToArray 를 호출 하여 강제로 즉시 실행

List<int> numQuery2 =
    (from num in numbers
     where (num % 2) == 0
     select num).ToList();

// or like this:
// numQuery3 is still an int[]

var numQuery3 =
    (from num in numbers
     where (num % 2) == 0
     select num).ToArray();

 

쿼리 구문 및 메서드 구문

사용자는 Query 구문 대신에 일반 method 구문을 사용하여 직접 호출 가능 하다. 

//Query syntax:
IEnumerable<int> querySyntax =
    from num in numbers
    where num % 2 == 0
    orderby num
    select num;

//Method syntax:
IEnumerable<int> methodSyntax = numbers.Where(num => num % 2 == 0).OrderBy(n => n);

foreach (int i in querySyntax)
{
    Console.Write(i + " ");
}
Console.WriteLine();
foreach (int i in methodSyntax)
{
    Console.Write(i + " ");
}
Console.WriteLine();
/*
    Output:
    0 2 4 6
    0 2 4 6
 */

 

확장메서드를 통해 IEnumerable<T> 에서 LINQ 관련 메서드 구문을 사용할 수 있게 해 놓았다. 

 

 

관련영상

https://youtu.be/GhfHa5TiZGE

 

반응형

'CSharp > Advance' 카테고리의 다른 글

LINQ Projection 연산자 (Select)  (0) 2022.02.02
LINQ 제한 연산자 (Where)  (0) 2022.02.01
제네릭 리플렉션 (Generic Reflection)  (0) 2022.01.28
제네릭 대리자 (Generic Delegate)  (0) 2022.01.27
제네릭 메서드 (Generic Method)  (0) 2022.01.26