맨위로가기

LINQ

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

LINQ(Language Integrated Query)는 데이터 쿼리를 위한 .NET 프레임워크의 구성 요소로, 표준 쿼리 연산자 API를 통해 사용자에게 노출되는 연산자 집합을 제공한다. C# 3.0, VB.NET 9.0, F# 등에서 언어 확장으로 구현되었으며, 쿼리 구문, 암시적 형식 변수, 익명 형식, 객체 초기자, 람다 식 등의 기능을 포함한다. LINQ는 다양한 데이터 소스에 적용 가능하며, LINQ 공급자를 통해 메모리 내 컬렉션, 데이터베이스, XML 문서 등 다양한 데이터 소스에 대한 쿼리를 지원한다. 또한, LINQ 쿼리의 병렬 실행을 위한 PLINQ(Parallel LINQ)도 제공한다. LINQ의 개념은 자바스크립트, PHP, 자바, 파이썬, Go 등 다양한 프로그래밍 언어에도 영향을 미쳤다.

더 읽어볼만한 페이지

  • 닷넷 용어 - XAML
    XAML은 마이크로소프트에서 개발한 XML 기반의 마크업 언어로, 사용자 인터페이스, 데이터 바인딩, 이벤트 처리 등을 정의하며 WPF, Silverlight, WF, WinRT API 앱, Xamarin.Forms 등에서 UI 개발에 널리 사용된다.
  • 닷넷 용어 - 윈도우 커뮤니케이션 파운데이션
    윈도우 커뮤니케이션 파운데이션(WCF)은 마이크로소프트가 분산 시스템 개발을 용이하게 하고 서비스 지향 아키텍처(SOA)를 구현하기 위해 개발한 프레임워크로, 다양한 전송 프로토콜과 메시지 인코딩 방식을 지원하며 닷넷 프레임워크 3.0의 일부로 출시되어 다양한 유형의 애플리케이션 통합을 목표로 한다.
  • 질의 언어 - 임베디드 SQL
    임베디드 SQL은 호스트 프로그래밍 언어 내에 SQL 문을 삽입하여 데이터베이스와 상호 작용하는 기술로, 데이터베이스 액세스를 표준화하지만 보안 취약점과 이식성 저하의 단점도 가진다.
  • 질의 언어 - XQuery
    XQuery는 함수형 프로그래밍 패러다임을 지원하며 XPath 식 구문의 상위 집합을 포함하는 XML 데이터 추출 및 조작을 위한 쿼리 언어로서, FLWOR 식을 통해 XML 데이터 조작 및 새로운 XML 문서 구성을 지원하고 XQuery 및 XPath 데이터 모델(XDM)을 기반으로 한다.
LINQ - [IT 관련 정보]에 관한 문서
일반 정보
이름통합 언어 쿼리
영어 이름Language Integrated Query
약칭LINQ
개발사마이크로소프트
설계자마이크로소프트
기술 정보
튜링 완전성아니오
타입 시스템스트롱 타입
구현체.NET 언어 (C#, F#, 비주얼 베이직 닷넷)
영향 받은 언어SQL, 하스켈
기타
웹사이트공식 웹사이트

2. 아키텍처

LINQ는 표준 쿼리 연산자(Standard Query Operator, SQO) API를 통해 사용자에게 쿼리 기능을 제공한다.[3] API에서 지원하는 쿼리 연산자와 컬렉션을 다른 유형으로 변환하는 연산자는 다음과 같다.

연산자설명
Select컬렉션에 대해 프로젝션을 수행하여 요소의 흥미로운 측면을 선택한다. 사용자는 명명된 메서드 또는 람다식 형태로 데이터 멤버를 투영하는 임의의 함수를 제공하며, 이 함수는 대리자로 연산자에 전달된다. 이는 Map 고차 함수를 구현한다.
Where컬렉션의 각 객체에 대해 평가되는 일련의 술어 규칙을 정의할 수 있으며, 규칙과 일치하지 않는 객체는 필터링된다. 술어는 대리자로 연산자에 제공된다. 이는 Filter 고차 함수를 구현한다.
SelectMany사용자가 제공한 컬렉션 요소에서 컬렉션으로의 매핑의 경우, 모든 요소가 해당 컬렉션에 매핑되고, 그 결과가 한 단계로 평탄화된다. Select와 Where는 모두 싱글톤 및 빈 컬렉션을 사용할 수 있는 한 SelectMany의 관점에서 구현할 수 있다. 이는 bind 고차 함수를 구현한다.
Sum / Min / Max / Average이 연산자는 선택적으로 컬렉션의 각 요소에서 특정 숫자 값을 검색하여 컬렉션의 모든 요소의 합, 최소값, 최대값 또는 평균값을 각각 찾는 함수를 사용한다. 오버로드된 버전은 함수를 사용하지 않고 ID가 람다로 지정된 것처럼 작동한다.
Aggregate일반화된 Sum / Min / Max이다. 이 연산자는 두 값을 결합하여 중간 또는 최종 결과를 형성하는 방법을 지정하는 함수를 사용한다. 선택적으로 시작 값을 제공하여 집계의 결과 유형을 임의로 지정할 수 있다. 또한 집계 결과를 다른 값으로 가져가는 최종화 함수를 제공할 수 있다. 이는 Fold 고차 함수를 구현한다.
Join / GroupJoinJoin 연산자는 각 컬렉션의 객체에 대한 일치하는 키를 기반으로 두 컬렉션에 대해 내부 조인을 수행한다. 각 컬렉션에 대해 컬렉션의 각 객체에서 키를 추출하기 위해 실행하는 두 개의 함수를 대리자로 사용한다. 또한 사용자가 일치하는 두 요소의 어떤 데이터 요소를 결과 객체를 생성하는 데 사용해야 하는지 지정하는 또 다른 대리자를 사용한다. GroupJoin 연산자는 그룹 조인을 수행한다. Select 연산자와 마찬가지로 조인의 결과는 소스 객체의 두 유형의 모든 데이터 멤버 또는 해당 하위 집합을 사용하여 다른 클래스의 인스턴스화이다.
Take / TakeWhileTake 연산자는 컬렉션에서 처음 n개의 객체를 선택하고, TakeWhile 연산자는 술어를 사용하여 술어와 일치하는 객체를 선택한다(일치하지 않는 첫 번째 객체에서 중지).
Skip / SkipWhileSkip 및 SkipWhile 연산자는 Take 및 TakeWhile의 보완 연산자이다. 컬렉션에서 처음 n개의 객체 또는 술어와 일치하는 객체(SkipWhile의 경우)를 건너뛴다.
OfTypeOfType 연산자는 특정 유형의 요소를 선택하는 데 사용된다.
ConcatConcat 연산자는 두 컬렉션을 연결한다.
OrderBy / ThenByOrderBy 연산자는 일부 키에 따라 컬렉션의 요소에 대한 기본 정렬 순서를 지정하는 데 사용된다. 기본 정렬 순서는 오름차순이며, 순서를 반전하려면 OrderByDescending 연산자를 사용해야 한다. ThenBy 및 ThenByDescending은 요소의 후속 순서를 지정한다. 객체에서 키 값을 추출하는 함수는 대리자 형태로 사용자가 지정한다.
ReverseReverse 연산자는 컬렉션을 반전시킨다.
GroupByGroupBy 연산자는 키 값을 추출하는 함수를 사용하여 각 고유 키 값에 대해 IGrouping 객체의 컬렉션을 반환한다. 그런 다음 IGrouping 객체를 사용하여 특정 키 값에 대한 모든 객체를 열거할 수 있다.
DistinctDistinct 연산자는 컬렉션에서 객체의 중복 인스턴스를 제거한다. 연산자의 오버로드는 고유성에 대한 기준을 정의하는 같음 비교자 객체를 사용한다.
Union / Intersect / Except이러한 연산자는 각각 두 시퀀스에 대해 합집합, 교집합 및 차집합 연산을 수행하는 데 사용된다. 각각은 요소의 같음 기준을 정의하는 같음 비교자 객체를 사용하는 오버로드를 갖는다.
SequenceEqualSequenceEqual 연산자는 두 컬렉션의 모든 요소가 동일하고 동일한 순서로 되어 있는지 여부를 결정한다.
First / FirstOrDefault / Last / LastOrDefault이러한 연산자는 술어를 사용한다. First 연산자는 술어가 true를 반환하는 첫 번째 요소를 반환하거나, 일치하는 항목이 없으면 예외를 발생시킨다. FirstOrDefault 연산자는 First 연산자와 유사하지만, 술어와 일치하는 항목이 없는 경우 요소 유형의 기본값(일반적으로 null 참조)을 반환한다. Last 연산자는 술어와 일치하는 마지막 요소를 검색하거나, 일치하는 항목이 없는 경우 예외를 발생시킨다. LastOrDefault는 일치하는 항목이 없는 경우 기본 요소 값을 반환한다.
SingleSingle 연산자는 술어를 사용하고 술어와 일치하는 요소를 반환한다. 일치하는 요소가 없거나 하나 이상인 경우 예외가 발생한다.
SingleOrDefaultSingleOrDefault 연산자는 술어를 사용하고 술어와 일치하는 요소를 반환한다. 둘 이상의 요소가 술어와 일치하면 예외가 발생한다. 술어와 일치하는 요소가 없으면 기본값이 반환된다.
ElementAtElementAt 연산자는 컬렉션에서 지정된 인덱스의 요소를 검색한다.
Any / AllAny 연산자는 술어와 일치하는 컬렉션에 요소가 있는지 확인한다. 요소를 선택하지 않고, 최소한 하나의 요소가 일치하면 true를 반환한다. 술어 없이 any를 호출하면 컬렉션이 비어 있지 않은 경우 true를 반환한다. All 연산자는 모든 요소가 술어와 일치하면 true를 반환한다.
ContainsContains 연산자는 컬렉션에 지정된 요소가 포함되어 있는지 확인한다.
CountCount 연산자는 지정된 컬렉션의 요소 수를 계산한다. 술어를 사용하는 오버로드는 술어와 일치하는 요소의 수를 계산한다.
AsEnumerable컬렉션을 IEnumerable로 정적으로 형식화한다.[4]
AsQueryable컬렉션을 IQueryable로 정적으로 형식화한다.
ToArray컬렉션에서 배열 T[]을 만든다.
ToList컬렉션에서 List를 만든다.
ToDictionary키 K로 인덱싱된 컬렉션에서 Dictionary을 만든다. 사용자가 제공한 프로젝션 함수는 각 요소에서 키를 추출한다.
ToLookup키 K로 인덱싱된 컬렉션에서 Lookup을 만든다. 사용자가 제공한 프로젝션 함수는 각 요소에서 키를 추출한다.
Cast제네릭이 아닌 IEnumerable 컬렉션을 각 요소를 유형 T로 캐스팅하여 IEnumerable 중 하나로 변환한다. 또는 각 요소를 유형 T에서 유형 R로 캐스팅하여 제네릭 IEnumerable를 다른 제네릭 IEnumerable로 변환한다. 요소 중 어느 것도 지정된 유형으로 캐스팅할 수 없는 경우 예외가 발생한다.
OfType제네릭이 아닌 IEnumerable 컬렉션을 IEnumerable 중 하나로 변환한다. 또는 각 요소를 유형 T에서 유형 R로 캐스팅하려고 시도하여 제네릭 IEnumerable를 다른 제네릭 IEnumerable로 변환한다. 두 경우 모두 대상 유형으로 성공적으로 캐스팅된 요소의 하위 집합만 포함된다. 예외는 발생하지 않는다.


2. 1. 표준 쿼리 연산자 API

LINQ에서 정의하는 연산자 집합은 표준 쿼리 연산자(SQO) API로 사용자에게 노출된다.[3] API에서 지원하는 쿼리 연산자는 다음과 같다.

연산자설명
Select컬렉션에 대해 프로젝션을 수행하여 요소의 흥미로운 측면을 선택한다. 사용자는 명명된 메서드 또는 람다식 형태로 데이터 멤버를 투영하는 임의의 함수를 제공하며, 이 함수는 대리자로 연산자에 전달된다. 이는 Map 고차 함수를 구현한다.
Where컬렉션의 각 객체에 대해 평가되는 일련의 술어 규칙을 정의할 수 있으며, 규칙과 일치하지 않는 객체는 필터링된다. 술어는 대리자로 연산자에 제공된다. 이는 Filter 고차 함수를 구현한다.
SelectMany사용자가 제공한 컬렉션 요소에서 컬렉션으로의 매핑의 경우, 모든 요소가 해당 컬렉션에 매핑되고, 그 결과가 한 단계로 평탄화된다. Select와 Where는 모두 싱글톤 및 빈 컬렉션을 사용할 수 있는 한 SelectMany의 관점에서 구현할 수 있다. 이는 bind 고차 함수를 구현한다.
Sum / Min / Max / Average이 연산자는 선택적으로 컬렉션의 각 요소에서 특정 숫자 값을 검색하여 컬렉션의 모든 요소의 합, 최소값, 최대값 또는 평균값을 각각 찾는 함수를 사용한다. 오버로드된 버전은 함수를 사용하지 않고 ID가 람다로 지정된 것처럼 작동한다.
Aggregate일반화된 Sum / Min / Max이다. 이 연산자는 두 값을 결합하여 중간 또는 최종 결과를 형성하는 방법을 지정하는 함수를 사용한다. 선택적으로 시작 값을 제공하여 집계의 결과 유형을 임의로 지정할 수 있다. 또한 집계 결과를 다른 값으로 가져가는 최종화 함수를 제공할 수 있다. 이는 Fold 고차 함수를 구현한다.
Join / GroupJoinJoin 연산자는 각 컬렉션의 객체에 대한 일치하는 키를 기반으로 두 컬렉션에 대해 내부 조인을 수행한다. 각 컬렉션에 대해 컬렉션의 각 객체에서 키를 추출하기 위해 실행하는 두 개의 함수를 대리자로 사용한다. 또한 사용자가 일치하는 두 요소의 어떤 데이터 요소를 결과 객체를 생성하는 데 사용해야 하는지 지정하는 또 다른 대리자를 사용한다. GroupJoin 연산자는 그룹 조인을 수행한다. Select 연산자와 마찬가지로 조인의 결과는 소스 객체의 두 유형의 모든 데이터 멤버 또는 해당 하위 집합을 사용하여 다른 클래스의 인스턴스화이다.
Take / TakeWhileTake 연산자는 컬렉션에서 처음 n개의 객체를 선택하고, TakeWhile 연산자는 술어를 사용하여 술어와 일치하는 객체를 선택한다(일치하지 않는 첫 번째 객체에서 중지).
Skip / SkipWhileSkip 및 SkipWhile 연산자는 Take 및 TakeWhile의 보완 연산자이다. 컬렉션에서 처음 n개의 객체 또는 술어와 일치하는 객체(SkipWhile의 경우)를 건너뛴다.
OfTypeOfType 연산자는 특정 유형의 요소를 선택하는 데 사용된다.
ConcatConcat 연산자는 두 컬렉션을 연결한다.
OrderBy / ThenByOrderBy 연산자는 일부 키에 따라 컬렉션의 요소에 대한 기본 정렬 순서를 지정하는 데 사용된다. 기본 정렬 순서는 오름차순이며, 순서를 반전하려면 OrderByDescending 연산자를 사용해야 한다. ThenBy 및 ThenByDescending은 요소의 후속 순서를 지정한다. 객체에서 키 값을 추출하는 함수는 대리자 형태로 사용자가 지정한다.
ReverseReverse 연산자는 컬렉션을 반전시킨다.
GroupByGroupBy 연산자는 키 값을 추출하는 함수를 사용하여 각 고유 키 값에 대해 IGrouping 객체의 컬렉션을 반환한다. 그런 다음 IGrouping 객체를 사용하여 특정 키 값에 대한 모든 객체를 열거할 수 있다.
DistinctDistinct 연산자는 컬렉션에서 객체의 중복 인스턴스를 제거한다. 연산자의 오버로드는 고유성에 대한 기준을 정의하는 같음 비교자 객체를 사용한다.
Union / Intersect / Except이러한 연산자는 각각 두 시퀀스에 대해 합집합, 교집합 및 차집합 연산을 수행하는 데 사용된다. 각각은 요소의 같음 기준을 정의하는 같음 비교자 객체를 사용하는 오버로드를 갖는다.
SequenceEqualSequenceEqual 연산자는 두 컬렉션의 모든 요소가 동일하고 동일한 순서로 되어 있는지 여부를 결정한다.
First / FirstOrDefault / Last / LastOrDefault이러한 연산자는 술어를 사용한다. First 연산자는 술어가 true를 반환하는 첫 번째 요소를 반환하거나, 일치하는 항목이 없으면 예외를 발생시킨다. FirstOrDefault 연산자는 First 연산자와 유사하지만, 술어와 일치하는 항목이 없는 경우 요소 유형의 기본값(일반적으로 null 참조)을 반환한다. Last 연산자는 술어와 일치하는 마지막 요소를 검색하거나, 일치하는 항목이 없는 경우 예외를 발생시킨다. LastOrDefault는 일치하는 항목이 없는 경우 기본 요소 값을 반환한다.
SingleSingle 연산자는 술어를 사용하고 술어와 일치하는 요소를 반환한다. 일치하는 요소가 없거나 하나 이상인 경우 예외가 발생한다.
SingleOrDefaultSingleOrDefault 연산자는 술어를 사용하고 술어와 일치하는 요소를 반환한다. 둘 이상의 요소가 술어와 일치하면 예외가 발생한다. 술어와 일치하는 요소가 없으면 기본값이 반환된다.
ElementAtElementAt 연산자는 컬렉션에서 지정된 인덱스의 요소를 검색한다.
Any / AllAny 연산자는 술어와 일치하는 컬렉션에 요소가 있는지 확인한다. 요소를 선택하지 않고, 최소한 하나의 요소가 일치하면 true를 반환한다. 술어 없이 any를 호출하면 컬렉션이 비어 있지 않은 경우 true를 반환한다. All 연산자는 모든 요소가 술어와 일치하면 true를 반환한다.
ContainsContains 연산자는 컬렉션에 지정된 요소가 포함되어 있는지 확인한다.
CountCount 연산자는 지정된 컬렉션의 요소 수를 계산한다. 술어를 사용하는 오버로드는 술어와 일치하는 요소의 수를 계산한다.



표준 쿼리 연산자 API는 또한 컬렉션을 다른 유형으로 변환하는 특정 연산자를 지정한다.[3]

연산자설명
AsEnumerable컬렉션을 IEnumerable로 정적으로 형식화한다.[4]
AsQueryable컬렉션을 IQueryable로 정적으로 형식화한다.
ToArray컬렉션에서 배열 T[]을 만든다.
ToList컬렉션에서 List를 만든다.
ToDictionary키 K로 인덱싱된 컬렉션에서 Dictionary을 만든다. 사용자가 제공한 프로젝션 함수는 각 요소에서 키를 추출한다.
ToLookup키 K로 인덱싱된 컬렉션에서 Lookup을 만든다. 사용자가 제공한 프로젝션 함수는 각 요소에서 키를 추출한다.
Cast제네릭이 아닌 IEnumerable 컬렉션을 각 요소를 유형 T로 캐스팅하여 IEnumerable 중 하나로 변환한다. 또는 각 요소를 유형 T에서 유형 R로 캐스팅하여 제네릭 IEnumerable를 다른 제네릭 IEnumerable로 변환한다. 요소 중 어느 것도 지정된 유형으로 캐스팅할 수 없는 경우 예외가 발생한다.
OfType제네릭이 아닌 IEnumerable 컬렉션을 IEnumerable 중 하나로 변환한다. 또는 각 요소를 유형 T에서 유형 R로 캐스팅하려고 시도하여 제네릭 IEnumerable를 다른 제네릭 IEnumerable로 변환한다. 두 경우 모두 대상 유형으로 성공적으로 캐스팅된 요소의 하위 집합만 포함된다. 예외는 발생하지 않는다.


2. 2. 언어 확장

LINQ는 주로 .NET Framework 3.5의 라이브러리로 구현되었지만, 쿼리를 쉽게 작성할 수 있도록 하는 언어 확장 기능도 제공한다. 이러한 확장은 C# 3.0,[5] VB 9.0, F#[6] 및 Oxygene 등에서 구현되었으며, Nemerle과 같은 다른 언어에서도 지원이 발표되었다.[7]

LINQ에 대응하는 언어들은 LINQ를 자연스럽게 도입하기 위해 새로운 언어 사양을 추가했다. 대표적인 예는 다음과 같다.

  • 쿼리 식: SQL과 유사한 질의 언어 스타일의 문법이 도입되었다. 이는 메서드 구문의 구문적 설탕이 된다.
  • 확장 메서드: 동일한 데이터 구조에 대해 나중에 연산을 추가하기 위해 도입되었다. 예를 들어, LINQ to Object의 경우 `IEnumerable` 인터페이스의 확장 메서드로 표준 쿼리 연산자를 포함하는 메서드 그룹이 추가되었다.
  • 람다 식: 기존 익명 메서드를 대체하는 구문으로 도입되었다. 인수의 형식을 생략할 수 있고 식 트리로 변환할 수 있다는 점에서 LINQ를 자연스럽게 도입할 수 있게 했다.
  • 익명 형식: 쿼리 결과나 중간값을 임시적인 값의 조합으로 보관할 수 있도록 도입되었다. 쿼리 결과 저장을 목적으로 하므로, 익명 형식의 각 값은 읽기 전용 속성이다.


C#의 사양에 대한 자세한 내용은 C# 3.0부터의 사양을 참고하면 된다.

언어 확장의 예시는 다음과 같다.[7]

  • 암시적 형식 변수: 변수의 형식을 지정하지 않고도 변수를 선언할 수 있다. C# 3.0[5] 및 Oxygene 언어는 `var` 키워드를, VB 9.0에서는 형식 선언이 없는 `Dim` 키워드를 사용한다. 이 객체들은 여전히 강력하게 형식화되며, 컴파일러는 형식 유추를 통해 변수의 형식을 유추한다.
  • 익명 형식: 데이터 멤버 선언만 포함하는 클래스를 컴파일러가 유추할 수 있게 한다. 이는 결과 형식이 원래 객체의 형식과 다를 수 있는 Select 및 Join 연산에 유용하다.
  • 객체 초기자: Select 및 Join 연산에 필요한 대로 단일 범위에서 객체를 생성하고 초기화할 수 있다.
  • 람다 식: 술어 및 기타 투영 함수를 간결한 구문으로 인라인으로 작성할 수 있으며, 완전한 어휘 폐쇄를 지원한다. 쿼리 공급자에 따라 대리자 또는 표현식 트리로 매개변수에 캡처된다.


예를 들어, `SomeProperty`가 10 미만인 컬렉션의 모든 객체를 선택하는 쿼리는 다음과 같이 작성할 수 있다.

```csharp

var results = from c in SomeCollection

where c.SomeProperty < 10

select new {c.SomeProperty, c.OtherProperty};

foreach (var result in results)

{

Console.WriteLine(result);

}

```

이 코드에서 변수 `result`, `c`, `results`의 형식은 컴파일러에 의해 유추된다. 이는 쿼리 표현식이 없는 다음 변환 결과와 동일하다.

```csharp

var results =

SomeCollection

.Where(c => c.SomeProperty < 10)

.Select(c => new {c.SomeProperty, c.OtherProperty});

results.ForEach(x => {Console.WriteLine(x.ToString());})

3. LINQ 공급자

LINQ 공급자는 LINQ 쿼리를 데이터 소스에 맞게 조정하는 데이터 소스별 구현으로, 표현식 트리를 통해 LINQ의 확장성을 제공한다. LINQ 공급자는 쿼리 실행에 필요한 부분을 생성하기 위해 쿼리에 포함된 표현식 트리를 분석하며, 이는 SQL 조각이나 추가 조작 가능한 데이터와 같이 코드를 완전히 다른 방식으로 표현할 수 있게 한다.

LINQ는 메모리 내 개체 컬렉션, 마이크로소프트 SQL 서버 데이터베이스, ADO.NET 데이터 세트 및 XML 문서에 대한 LINQ 공급자를 제공하며, 이들은 LINQ의 다양한 변형을 정의한다. LINQ는 서드 파티를 포함한 모든 종류의 데이터 소스에 적용될 수 있으며, 표준 쿼리 연산자에 대응하는 기능을 확장 메서드로 데이터 소스에 추가함으로써 실현된다.

기존에는 배열(Array 클래스)이나 컬렉션 객체를 사용하여 동일한 종류의 데이터 형식이나 객체 집합에 대한 열거, 정렬, 필터링을 효율적으로 처리했다. 반면, 데이터베이스XML 상의 데이터 집합은 ADO.NET에 의해 데이터 세트로 취급되어 다른 조작이 필요했다. LINQ는 이러한 객체나 데이터 세트를 구분하지 않고 공통적으로 처리할 수 있게 해준다.

마이크로소프트는 다음과 같은 LINQ 구현을 제공한다:


  • LINQ to Objects (모든 컬렉션/열거자를 LINQ 쿼리로 조작 가능)
  • LINQ to XML (XLinq)
  • LINQ to ADO.NET
  • LINQ to SQL (DLinq / SQL Server 전용)
  • LINQ to Entities (SQL Server / Oracle Database / MySQL / SQLite 등)
  • LINQ to DataSet (DataSet에 대한 확장 메서드를 통해 LINQ 쿼리 기술 가능)
  • Azure Table Storage (Windows Azure의 키-값 저장소에서 LINQ 쿼리 기술 가능)


서드 파티 데이터 소스로는 LINQ to Twitter가 있으며, 이는 트위터의 정보를 소스로 한다.

4. PLINQ (병렬 LINQ)

.NET 프레임워크 버전 4부터 PLINQ(병렬 LINQ)가 포함되었는데, 이는 LINQ 쿼리를 위한 병렬 실행 엔진이다. `ParallelQuery` 클래스를 정의한다. `IEnumerable` 인터페이스 구현체는 닷넷 프레임워크의 System.Linq 이름공간에 있는 ParallelEnumerable 클래스에 정의된 `AsParallel(this IEnumerable)` 확장 메소드를 호출하여 PLINQ 엔진의 이점을 활용할 수 있다.[37] PLINQ 엔진은 여러 스레드에서 동시에 쿼리의 일부를 실행하여 더 빠른 결과를 낼 수 있다.[38]

5. 예제 (C#)

다음은 C#를 사용한 예시이다. 아래 코드는 `fruits` 배열에서 "m"으로 시작하는 문자열을 추출하여 `ret`에 저장하고, foreach 문을 사용하여 결과를 순서대로 출력한다. 이때 `ret`는 지연 평가된다.

```csharp

using System;

using System.Linq; // LINQ 확장 메서드를 사용하려면 필요하다. 메서드 구문뿐만 아니라 쿼리 구문을 사용할 때도 필요하다.

public class Test

{

public static void Main()

{

string[] fruits =

{

"apple",

"cherry",

"melon",

"orange",

"marron",

"mango",

};

// 쿼리 구문

Console.WriteLine("Query Syntax");

{

// from부터 select까지 일련의 식이 LINQ 쿼리 식이다.

var ret = from x in fruits

where !string.IsNullOrEmpty(x) && x[0] == 'm'

select x;

foreach (var e in ret)

{

Console.WriteLine(e);

}

}

// 메서드 구문

Console.WriteLine("Method Syntax");

{

// 객체를 필터링하는 조건(술어)을 람다식으로 지정한다.

var ret = fruits.Where(x => !string.IsNullOrEmpty(x) && x[0] == 'm');

foreach (var e in ret)

{

Console.WriteLine(e);

}

}

}

}

6. 다른 언어에서의 구현

LINQ의 개념은 다른 프로그래밍 언어에도 영향을 주었다.

PHP ([https://phplinq.codeplex.com/ PHPLinq]), 자바스크립트 ([https://github.com/mihaifm/linq linq.js]), TypeScript ([https://github.com/kutyel/linq.ts linq.ts]), ActionScript ([http://actionlinq.riaforge.org/ ActionLinq])에서도 사용 가능하지만, C#, F#, VB.NET과 같은 .NET 기반 언어에서 LINQ가 언어의 일부로 포함되어 있으며, 더 광범위한 요구 사항을 충족하는 것과는 엄밀히 동일하지 않다.

LINQ는 LINQ의 사상에 감화된 사람들에 의해, 마이크로소프트 계열 프로그래밍 언어에 국한되지 않고 다양한 프로그래밍 언어에서 구현되고 있다.


  • jLinq[24] - 자바스크립트에서의 구현
  • JSINQ[25] - 자바스크립트에서의 구현
  • linq.js[26] - 자바스크립트에서의 구현
  • Chris Pietschmann's LINQ to JavaScript[27] - 자바스크립트에서의 구현
  • PHPLinq[28] - PHP에서의 구현
  • Quaere[29] - 자바에서의 구현
  • JaQue[30] - 자바에서의 구현
  • JaQu[31] - 자바에서의 구현
  • Querydsl[32] - 자바에서의 구현
  • pynq[33] - 파이썬에서의 구현
  • go-linq[34] - Go에서의 구현

참조

[1] 웹사이트 Rx framework http://msdn.microsof[...] 2011-06-10
[2] 웹사이트 Monadic Parser Combinators using C#3 http://blogs.msdn.co[...] 2009-11-21
[3] 웹사이트 Standard Query Operators http://download.micr[...] Microsoft 2007-11-30
[4] 웹사이트 Enumerable Class http://msdn.microsof[...] Microsoft 2014-02-15
[5] 서적 C# in Depth Manning 2019-03-23
[6] 웹사이트 Query Expressions (F#) https://docs.microso[...] 2012-12-19
[7] 웹사이트 LINQ Framework http://msdn.microsof[...] 2007-11-30
[8] 웹사이트 Enumerable.ElementAt http://msdn.microsof[...] 2014-05-07
[9] 웹사이트 Enumerable.Contains http://msdn.microsof[...] 2014-05-07
[10] 웹사이트 Enumerable.Count http://msdn.microsof[...] 2014-05-07
[11] 웹사이트 .NET Language-Integrated Query for XML Data http://msdn2.microso[...] 2007-11-30
[12] 웹사이트 LINQ to SQL http://www.hookedonl[...] 2007-11-30
[13] 웹사이트 LINQ to SQL: .NET Language-Integrated Query for Relational Data http://msdn2.microso[...] 2007-11-30
[14] 웹사이트 LINQ to DataSets http://www.hookedonl[...] 2007-11-30
[15] 웹사이트 LINQ Performance Test: My First Visual Studio 2008 Project http://www.codeproje[...] 2009-02-08
[16] 웹사이트 Increase LINQ Query Performance http://msdn.microsof[...] Microsoft Developer Network 2014-03-19
[17] 웹사이트 Potential Performance Issues with Compiled LINQ Query Re-Compiles http://blogs.msdn.co[...] Microsoft Developer Network 2014-03-19
[18] 웹사이트 Performance comparisons LinQ to SQL, ADO, C# http://www.codeproje[...] 2009-02-08
[19] 웹사이트 ParallelEnumerable Class http://msdn.microsof[...] 2014-05-07
[20] 웹사이트 Programming in the Age of Concurrency: Concurrent Programming with PFX http://channel9.msdn[...] 2007-10-16
[21] 서적 LINQ in Action Manning
[22] 문서 Concepts behind the C# 3.0 language | Articles | TomasP.Net https://web.archive.[...] 2007-02-12
[23] 웹사이트 The Joins Concurrency Library http://research.micr[...] 2007-06-08
[24] 문서 http://www.hugoware.[...]
[25] 문서 JSINQ - LINQ to Objects for JavaScript - CodePlex Archive http://www.codeplex.[...]
[26] 문서 linq.js - LINQ for JavaScript - CodePlex Archive http://linqjs.codepl[...]
[27] 문서 LINQ to JavaScript - CodePlex Archive http://www.codeplex.[...]
[28] 문서 PHPLinq - LINQ for PHP - Language Integrated Query - CodePlex Archive http://www.codeplex.[...]
[29] 문서 http://xircles.codeh[...]
[30] 문서 http://jaque.googlec[...]
[31] 문서 JaQu http://h2database.co[...]
[32] 문서 http://source.mysema[...]
[33] 문서 GitHub - heynemann/pynq: Python implementation of Microsoft's .Net Language Integrated Query (LINQ) https://github.com/h[...]
[34] 문서 http://ahmetalpbalka[...]
[35] 웹인용 Rx framework http://msdn.microsof[...]
[36] 웹인용 Monadic Parser Combinators using C#3 http://blogs.msdn.co[...] 2009-11-21
[37] 웹인용 ParallelEnumerable Class http://msdn.microsof[...] 2014-05-07
[38] 웹인용 Programming in the Age of Concurrency: Concurrent Programming with PFX http://channel9.msdn[...] 2007-10-16



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com