언어 통합 쿼리
Language Integrated Query설계자 | 마이크로소프트 코퍼레이션 |
---|---|
개발자 | 마이크로소프트 코퍼레이션 |
타이핑 분야 | 강하게 입력됨 |
웹 사이트 | docs |
주요 구현 | |
.NET 언어(C#, F#, VB).네트워크) | |
영향을 받다 | |
SQL, Haskell |
Language Integrated Query (LINQ, "link"로 발음)는 Microsoft 입니다.에 네이티브 데이터 쿼리 기능을 추가하는 NET Framework 컴포넌트.NET 언어(원래의 주요 부분으로서 릴리스되었습니다).2007년의 NET Framework 3.5.
LINQ는 SQL 문과 유사한 쿼리 식을 추가하여 언어를 확장하며 배열, 열거형 클래스, XML 문서, 관계형 데이터베이스 및 서드파티 데이터 원본에서 데이터를 쉽게 추출 및 처리하는 데 사용할 수 있습니다.쿼리 식을 임의의 계산을 읽기 쉽게 구성하기 위한 일반적인 프레임워크로 사용하는 다른 용도에는 이벤트[1] 핸들러 또는 모나드 [2]파서의 구성이 포함됩니다.또한 일련의 메서드 이름(표준 쿼리 연산자 또는 표준 시퀀스 연산자)과 컴파일러가 이러한 메서드 이름, 람다 식 및 익명 유형을 사용하여 fluent-style(Microsoft에 의해 메서드 구문이라고 함)을 사용하여 쿼리 구문식을 식으로 변환하기 위해 사용하는 변환 규칙을 정의합니다.LINQ가 도입한 개념의 대부분은 원래 마이크로소프트의 C† 연구 프로젝트에서 테스트되었습니다.
LINQ 포트는 PHP(PHPLinq), JavaScript(linq.js), TypeScript(linq.ts) 및 ActionScript(ActionLinq)용으로 존재하지만 의 LINQ와 엄밀하게 동등한 포트는 없습니다.NET에서 영감을 받은 언어 C#, F# 및 VB.NET(외부 라이브러리가 아닌 언어의 일부이며,[citation needed] 광범위한 요구에 대응하는 경우가 많다).
의 LINQ 아키텍처NET 프레임워크
표준 쿼리 연산자 API
다음 내용에서 연산자에 대한 설명은 컬렉션의 적용에 기초한다.많은 연산자가 다른 함수를 인수로 사용합니다.이러한 함수는 명명된 메서드 또는 익명 함수의 형태로 제공될 수 있습니다.
LINQ에 의해 정의된 쿼리 연산자 세트는 사용자에게 Standard Query Operator(SQO; 표준 쿼리 연산자) API로 표시됩니다.API에서 지원되는 쿼리 연산자는 다음과 같습니다.[3]
- 선택한다.
Select 연산자는 컬렉션에 투영을 수행하여 요소의 흥미로운 측면을 선택합니다.사용자는 데이터 멤버를 투영하는 임의 함수를 명명식 또는 람다 식 형식으로 제공합니다.함수는 오퍼레이터에게 위임자로 전달됩니다.
- 어디에
Where 연산자를 사용하면 컬렉션의 각 개체에 대해 평가되는 일련의 술어 규칙을 정의할 수 있으며 규칙과 일치하지 않는 개체는 필터링되어 제거됩니다.술어는 대리자로 연산자에게 제공됩니다.
- 다수 선택
수집 요소에서 수집에 대한 사용자 제공 매핑의 경우 의미론적으로 두 가지 단계가 수행됩니다.먼저 모든 요소가 대응하는 컬렉션에 매핑됩니다.둘째, 첫 번째 단계의 결과는 1단계 평탄화된다.주의: 싱글톤과 빈 컬렉션을 사용할 수 있는 한 Select Many의 관점에서 [Select]와 [Where is implementable]를 선택합니다.위의 변환 규칙에서는 LINQ 공급자가 다른 2개의 연산자를 제공해야 합니다.
- 합계 / 최소 / 최대 / 평균
이러한 연산자는 선택적으로 컬렉션 내의 각 요소에서 특정 숫자 값을 가져오는 함수를 사용하여 컬렉션 내의 모든 요소의 합, 최소, 최대 또는 평균 값을 각각 찾습니다.오버로드된 버전은 기능을 사용하지 않고 ID가 람다로 지정된 것처럼 작동합니다.
- 집약
일반화합/최소/최대.이 연산자는 중간 또는 최종 결과를 형성하기 위해 두 값을 결합하는 방법을 지정하는 함수를 사용합니다.임의로 시작값을 지정할 수 있으므로 집계의 결과 유형을 임의로 지정할 수 있습니다.또, 집계 결과를 다른 값으로 하는 최종화 함수를 제공할 수 있다.
- 가입/그룹 가입
- Join 연산자는 각 컬렉션의 객체에 대해 일치하는 키를 기반으로 두 컬렉션에 대해 내부 조인을 수행합니다.개체에서 키를 추출하기 위해 컬렉션의 각 개체에 대해 실행되는 두 가지 기능을 위임자로 사용합니다.또한 사용자가 두 개의 일치된 요소에서 결과 개체를 생성하기 위해 사용해야 하는 데이터 요소를 지정하는 다른 위임자가 필요합니다.GroupJoin 연산자는 그룹 가입을 수행합니다.Select 연산자와 마찬가지로 조인 결과는 서로 다른 클래스의 인스턴스화(instation)로, 소스 객체 유형 또는 그 하위 집합의 모든 데이터 멤버를 포함합니다.
- Take / Take While
- Take 연산자는 컬렉션에서 처음 n개의 개체를 선택하고 Take While 연산자는 술어와 일치하는 개체를 선택합니다(일치하지 않는 첫 번째 개체에서 중지).
- 건너뛰기/건너뛰기
- Skip 및 Skip While 연산자는 Take 및 Take While 연산자를 보완하여 컬렉션에서 처음 n개의 개체 또는 술어와 일치하는 개체(Skip While의 경우)를 건너뜁니다.
- 타입
- OfType 연산자는 특정 유형의 요소를 선택하는 데 사용됩니다.
- 콘캣
- Concat 연산자는 두 개의 컬렉션을 연결합니다.
- OrderBy / ThenBy
- OrderBy 연산자는 컬렉션 내 요소의 프라이머리 정렬 순서를 특정 키에 따라 지정하는 데 사용됩니다.기본 순서는 오름차순입니다.순서를 되돌리려면 OrderByDescending 연산자를 사용합니다.ThenBy 및 ThenByDescending은 요소의 후속 순서를 지정합니다.개체에서 키 값을 추출하는 함수는 사용자가 위임자로 지정합니다.
- 리버스
- Reverse 연산자는 컬렉션을 되돌립니다.
- 그룹 기준
- GroupBy 연산자는 키 값을 추출하는 함수를 사용하여 다음 값을 반환합니다.
IGrouping<Key, Values>
오브젝트(개별 키 값)를 지정합니다.그IGrouping
오브젝트를 사용하여 특정 키 값의 모든 오브젝트를 열거할 수 있습니다. - 분명한
- 고유 연산자는 컬렉션에서 개체의 중복 인스턴스를 제거합니다.연산자의 오버로드가 구별 기준을 정의하는 등비교 객체를 취한다.
- 결합 / 교차 / 예외
- 이러한 연산자는 두 시퀀스에 대해 합집합, 교차 및 차이 연산을 각각 수행하는 데 사용됩니다.각각에 오버로드가 있어 요소의 동등성 기준을 정의하는 동등성 비교기 객체를 취합니다.
- 시퀀스 동일
- SequenceEqual 연산자는 두 컬렉션의 모든 요소가 동일하고 같은 순서로 있는지 여부를 결정합니다.
- First/FirstOrDefault/LastOrDefault
- 이러한 연산자는 술어를 사용합니다.First 연산자는 술어가 true를 생성하는 첫 번째 요소를 반환하거나 일치하는 항목이 없는 경우 예외를 발생시킵니다.FirstOrDefault 연산자는 술어와 일치하는 것이 없는 경우 요소 유형의 기본값(보통 null 참조)을 반환한다는 점을 제외하고 First 연산자와 같습니다.마지막 연산자는 술어와 일치하는 마지막 요소를 가져오거나 일치하는 항목이 없는 경우 예외를 발생시킵니다.일치하는 항목이 없는 경우 LastOrDefault는 기본 요소 값을 반환합니다.
- 싱글
- Single 연산자는 술어를 사용하여 술어와 일치하는 요소를 반환합니다.술어와 일치하는 요소가 하나 이상 없는 경우 예외가 느려집니다.
- SingleOrDefault(Single Or Default)
- SingleOrDefault 연산자는 술어를 사용하여 술어와 일치하는 요소를 반환합니다.여러 요소가 술어와 일치하면 예외가 느려집니다.술어와 일치하는 요소가 없는 경우 기본값이 반환됩니다.
- 요소
- ElementAt 연산자는 컬렉션의 지정된 인덱스에서 요소를 가져옵니다.
- 임의/모두
- Any 연산자는 컬렉션에 술어와 일치하는 요소가 있는지 확인합니다.요소를 선택하지 않지만 하나 이상의 요소가 일치하면 true를 반환합니다.집합이 비어 있지 않으면 술어 없이 any를 호출하면 true가 반환됩니다.모든 요소가 술어와 일치하는 경우 All 연산자는 true를 반환합니다.
- 포함하다
- Contains 연산자는 컬렉션에 지정된 요소가 포함되어 있는지 확인합니다.
- 세어보세요
- 카운트 연산자는 지정된 컬렉션의 요소 수를 카운트합니다.술어를 사용하는 오버로드에서는 술어와 일치하는 요소의 수를 카운트합니다.
또한 표준 쿼리 연산자 API는 컬렉션을 다른 [3]유형으로 변환하는 특정 연산자를 지정합니다.
- 애즈넘버블:컬렉션을 정적으로 입력합니다.
IEnumerable<T>
를 클릭합니다.[4] - 쿼리 가능:컬렉션을 정적으로 입력합니다.
IQueryable<T>
. - ToArray: 어레이를 만듭니다.
T[]
를 참조해 주세요. - ToList: 작성한다.
List<T>
를 참조해 주세요. - ToDictionary: 생성한다.
Dictionary<K, T>
키 K에 의해 색인화된 컬렉션에서 추출됩니다.유저 제공 투영 기능은, 각 요소로부터 키를 추출한다. - ToLookup : 작성
Lookup<K, T>
키 K에 의해 색인화된 컬렉션에서 추출됩니다.유저 제공 투영 기능은, 각 요소로부터 키를 추출한다. - 캐스트: 일반적이지 않은 변환
IEnumerable
중 하나에 대한 징수IEnumerable<T>
각 요소를 조판하여T
. 대체적으로 범용 변환IEnumerable<T>
다른 총칭으로IEnumerable<R>
각 요소를 활자에서 주조하여T
타이핑하다R
. 지정된 유형으로 캐스팅할 수 없는 요소에서 예외를 발생시킵니다. - OfType: 일반적이지 않은 것을 변환합니다.
IEnumerable
중 하나에 대한 징수IEnumerable<T>
. 대체적으로 범용 변환IEnumerable<T>
다른 총칭으로IEnumerable<R>
각 요소를 활자에서 주조하려고 시도함으로써T
타이핑하다R
두 경우 모두 타깃유형에 성공적으로 캐스팅된 요소의 서브셋만 포함됩니다.예외는 없습니다.
언어 확장자
LINQ는 주로 의 라이브러리로 구현됩니다.NET Framework 3.5는 또한 쿼리를 1등급 언어 구성으로 만들고 쿼리를 작성하기 위한 통사적 설탕을 제공하는 선택적 언어 확장자를 정의합니다.이러한 언어 확장 기능은 처음에 C# 3.0, VB 9.0,[5] F# 및 Oxygene에서 구현되었으며 Nemerle과 같은 다른 언어도 사전 지원을 발표했습니다.언어 확장자는 다음과 같습니다.[6]
- 쿼리 구문: 언어는 네이티브로 인식할 쿼리 구문을 자유롭게 선택할 수 있습니다.이러한 언어 키워드는 컴파일러가 적절한 LINQ 메서드 호출을 위해 번역해야 합니다.
- 암묵적으로 입력된 변수:이 확장 기능을 사용하면 변수를 유형을 지정하지 않고 선언할 수 있습니다.언어 C# 3.0 및 Oxygene은 이러한 언어들을
var
키워드를 지정합니다.VB9.0에서는Dim
type declaration을 사용하지 않는 키워드도 마찬가지입니다.이러한 객체는 여전히 강하게 유형화되어 있으며, 이러한 객체에 대해 컴파일러는 유형 추론을 통해 변수 유형을 추론하여 중간 변수 유형을 선언하지 않고 쿼리 결과를 지정하고 정의할 수 있습니다. - 익명 유형:익명 유형을 사용하면 데이터 멤버 선언만 포함하는 클래스를 컴파일러가 추론할 수 있습니다.이것은 결과 유형이 원래 개체 유형과 다를 수 있는 선택 및 참여 연산자에게 유용합니다.컴파일러는 유형 추론을 사용하여 클래스에 포함된 필드를 결정하고 이러한 필드에 대한 접근자 및 변환자를 생성합니다.
- Object Initializer: 객체 이니셜라이저를 사용하면 Select 연산자와 Join 연산자의 필요에 따라 단일 범위에서 객체를 만들고 초기화할 수 있습니다.
- Lambda 식: Lambda 식을 사용하면 술어 및 기타 투영 함수를 간결한 구문을 사용하여 인라인으로 작성할 수 있으며 완전한 어휘 닫힘을 지원합니다.쿼리 공급자에 따라 위임 또는 식 트리로 매개 변수에 캡처됩니다.
예를 들어, 컬렉션의 모든 개체를 선택하는 쿼리에서SomeProperty
10 미만
변화하다 결과. = 부터 c 에 일부 컬렉션 어디에 c.일부 속성 < > 10 선택한다. 신규 {c.일부 속성, c.기타 속성}; 앞지르다 (변화하다 결과 에 결과.) { 콘솔.기입선(결과); }
변수 result, c 및 result의 유형은 모두 최종적으로 사용되는 메서드의 시그니처에 따라 컴파일러에 의해 추론됩니다.메서드를 선택하는 근거는 쿼리 무표현 번역 결과에 의해 형성됩니다.
변화하다 결과. = 일부 컬렉션 .어디에(c => c.일부 속성 < > 10) .선택한다.(c => 신규 {c.일부 속성, c.기타 속성}); 결과..각각에 대해서(x => {콘솔.기입선(x.ToString(ToString)());})
LINQ 프로바이더
C#3.0 사양에서는 LINQ 식에서 LINQ 식 없는 C#3.0의 서브셋으로 식으로의 변환 규칙과 함께 쿼리 식 패턴을 정의합니다.이와 같이 정의된 변환은 실제로 입력되지 않은 것으로, 람다 식은 위임 또는 식 트리로 해석할 수 있을 뿐만 아니라, 인터페이스의 일부를 LINQ 식구로 공개하는 라이브러리에도 큰 유연성을 제공합니다.예를 들어, LINQ to Objects는 다음에 대해 작동합니다.IEnumerable<T>
및 위임자를 사용하는 반면 LINQ에서 SQL로 표현 트리를 사용합니다.
표현 트리는 LINQ 확장성 메커니즘의 핵심이며, 이를 통해 LINQ를 많은 데이터 소스에 적용할 수 있습니다.식 트리는 LINQ 공급자에게 인계됩니다. LINQ 공급자는 데이터 소스와 함께 사용하도록 LINQ 쿼리를 조정하는 데이터 소스 고유의 구현입니다.선택한 경우 LINQ 공급자는 쿼리에 포함된 식 트리를 분석하여 쿼리 실행에 필요한 필수 요소를 생성합니다.이것은 SQL fragment 또는 추가 조작 가능한 데이터로서 완전히 다른 코드 표현일 수 있습니다.LINQ는 메모리 내 객체 컬렉션, Microsoft SQL Server 데이터베이스, ADO를 위한 LINQ 공급자와 함께 제공됩니다.NET 데이터셋 및 XML 문서LINQ의 다양한 플레이버는 다음과 같이 정의됩니다.
오브젝트에 대한 LINQ
LINQ to Objects 공급자는 LINQ의 로컬 쿼리 실행 엔진을 사용하여 메모리 내 수집에 사용됩니다.이 공급자에 의해 생성된 코드는 에 정의된 표준 쿼리 연산자의 구현을 참조합니다.Sequence
패턴 및 허용IEnumerable<T>
로컬로 쿼리되는 컬렉션입니다.LINQ to Objects의 현재 구현에서는 IEnumerable [7][8][9]런타임유형에 의해 지원되는 경우 빠른 멤버십테스트, 카운트 및 인덱스 룩업 조작을 가능하게 하는 인터페이스 구현 체크를 수행합니다.
LINQ에서 XML(구칭 XLINQ)
LINQ to XML 공급자는 XML 문서를 다음 모음으로 변환합니다.XElement
오브젝트는 표준 쿼리 [10]연산자 구현의 일부로 제공되는 로컬 실행 엔진을 사용하여 쿼리됩니다.
LINQ에서 SQL(구칭 DLINQ)
LINQ to SQL 공급자는 LINQ를 사용하여 SQL Server Compact 데이터베이스를 포함한 Microsoft SQL Server 데이터베이스를 쿼리할 수 있습니다.SQL Server 데이터는 원격 서버에 있을 수 있으며 SQL Server에는 자체 쿼리 엔진이 있으므로 LINQ-to-SQL은 LINQ의 쿼리 엔진을 사용하지 않습니다.대신 LINQ 조회를 SQL 조회로 변환한 다음 처리를 [11]위해 SQL 서버로 전송됩니다.단, SQL Server는 데이터를 관계형 데이터로 저장하고 LINQ는 오브젝트에 캡슐화된 데이터와 함께 작동하므로 두 표현은 서로 매핑해야 합니다.따라서 LINQ-to-SQL은 매핑 프레임워크도 정의합니다.매핑은 데이터베이스 내의 테이블에 대응하는 클래스를 정의하고 테이블 내의 모든 열 또는 일부 열을 [12]데이터 멤버로 포함하는 방식으로 수행됩니다.대응관계는 기본 키와 같은 다른 관계형 모델 속성과 함께 SQL 정의 속성에 대한 LINQ를 사용하여 지정됩니다.예를들면,
[표(이름=)"고객님들] 일반의 학급 고객. { [열(IsPrimaryKey = true)] 일반의 인트 고객 ID; [칼럼] 일반의 스트링 고객명; }
이 클래스 정의는 다음과 같은 이름의 테이블에 매핑됩니다.Customers
두 데이터 구성원은 두 열에 해당합니다.클래스를 정의해야 LINQ to SQL을 사용할 수 있습니다.Visual Studio 2008에는 개체의 데이터 스키마와 관계 도메인 간의 매핑을 생성하는 데 사용할 수 있는 매핑 디자이너가 포함되어 있습니다.데이터베이스 스키마에서 대응하는 클래스를 자동으로 작성할 수 있을 뿐만 아니라 테이블의 [12]서브셋이나 컬럼만을 사용하여 수동으로 편집하여 다른 뷰를 작성할 수 있습니다.
매핑은 에 의해 구현됩니다.DataContext
서버에 접속 스트링을 가져와서, 이 스트링을 사용하여,Table<T>
여기서 T는 데이터베이스 테이블을 매핑하는 유형입니다.그Table<T>
테이블 내의 데이터를 캡슐화하여IQueryable<T>
표현 트리가 생성되고 LINQ에서 SQL 공급자로 처리됩니다.쿼리를 T-SQL로 변환하고 데이터베이스 서버에서 결과 세트를 가져옵니다.처리는 데이터베이스 서버에서 이루어지므로 술어를 나타내는 람다 식의 일부로 정의되지 않은 로컬 메서드는 사용할 수 없습니다.그러나 서버에 저장된 프로시저를 사용할 수 있습니다.결과 세트에 대한 변경은 추적되며 데이터베이스 [12]서버에 다시 제출할 수 있습니다.
LINQ에서 DataSet으로
LINQ to SQL 공급자(위)는 Microsoft SQL Server 데이터베이스에서만 작동하므로 LINQ는 범용 데이터베이스를 지원하기 위해 LINQ to DataSets도 포함합니다.ADO를 사용합니다.데이터베이스와의 통신을 처리하는 NET.데이터가 ADO에 저장되면NET 데이터셋, LINQ to DataSets는 이러한 [13]데이터셋에 대해 쿼리를 실행합니다.
성능
이 문서의 일부(퍼포먼스와 관련된 부분)를 업데이트해야 합니다.그 이유는 다음과 같습니다.소스가 오래되어 이전보다 성능이 향상되었습니다.(2021년 11월) |
비전문 사용자는 LINQ to Objects의 기능 및 구문에 문제가 있을 수 있습니다.순진한 LINQ 구현 패턴은 성능 [14][15]저하로 이어질 수 있습니다.
ADO와 비교하여 LINQ에서 XML로, LINQ에서 SQL로 성능 향상NET은 사용 [16][17]사례에 따라 달라집니다.
플린
의 버전 4NET 프레임워크에는 LINQ 쿼리를 위한 병렬 실행 엔진인 PLINQ(Parallel LINQ)가 포함되어 있습니다.이 명령어는ParallelQuery<T>
class. 의 모든 실장IEnumerable<T>
PLINQ 엔진을 이용할 수 있습니다.AsParallel<T>(this IEnumerable<T>)
확장 메서드는 시스템의 ParallelEnumerable 클래스에 의해 정의됩니다.의 Linq 네임스페이스NET [18]프레임워크PLINQ 엔진은 쿼리의 일부를 여러 스레드에서 동시에 실행할 수 있으므로 [19]더 빠른 결과를 얻을 수 있습니다.
「 」를 참조해 주세요.
- Object-Relational Mapping(ORM; 객체 관계 매핑)
- 객체-관계 임피던스 불일치
- 리스트 이해
- 게으른 평가
레퍼런스
- ^ "Rx framework".
- ^ "Monadic Parser Combinators using C#3". Retrieved 2009-11-21.
- ^ a b "Standard Query Operators". Microsoft. Retrieved 2007-11-30.
- ^ "Enumerable Class". msdn. Microsoft. Retrieved 15 February 2014.
- ^ "Query Expressions (F#)". Microsoft Docs. Retrieved 2012-12-19.
- ^ "LINQ Framework". Retrieved 2007-11-30.
- ^ "Enumerable.ElementAt". Retrieved 2014-05-07.
- ^ "Enumerable.Contains". Retrieved 2014-05-07.
- ^ "Enumerable.Count". Retrieved 2014-05-07.
- ^ ".NET Language-Integrated Query for XML Data". Retrieved 2007-11-30.
- ^ "LINQ to SQL". Archived from the original on 2013-01-25. Retrieved 2007-11-30.
- ^ a b c "LINQ to SQL: .NET Language-Integrated Query for Relational Data". Retrieved 2007-11-30.
- ^ "LINQ to DataSets". Archived from the original on 2013-01-25. Retrieved 2007-11-30.
- ^ Vider, Guy (2007-12-21). "LINQ Performance Test: My First Visual Studio 2008 Project". Retrieved 2009-02-08.
- ^ Parsons, Jared (2008). "Increase LINQ Query Performance". Microsoft Developer Network. Retrieved 2014-03-19.
While it is true that LINQ is powerful and very efficient, large sets of data can still cause unexpected performance problems
- ^ Alva, Jaime (2010-08-06). "Potential Performance Issues with Compiled LINQ Query Re-Compiles". Microsoft Developer Network. Retrieved 2014-03-19.
When calling a query multiple times with Entity Framework the recommended approach is to use compiled LINQ queries. Compiling a query results in a performance hit the first time you use the query but subsequent calls execute much faster
- ^ Kshitij, Pandey (2008-05-25). "Performance comparisons LinQ to SQL, ADO, C#". Retrieved 2009-02-08.
- ^ "ParallelEnumerable Class". Retrieved 2014-05-07.
- ^ "Programming in the Age of Concurrency: Concurrent Programming with PFX". Retrieved 2007-10-16.