LINQ
"오늘의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)을 기반으로 한다.
2. 아키텍처
LINQ는 표준 쿼리 연산자(Standard Query Operator, SQO) API를 통해 사용자에게 쿼리 기능을 제공한다.[3] API에서 지원하는 쿼리 연산자와 컬렉션을 다른 유형으로 변환하는 연산자는 다음과 같다.
2. 1. 표준 쿼리 연산자 API
LINQ에서 정의하는 연산자 집합은 표준 쿼리 연산자(SQO) API로 사용자에게 노출된다.[3] API에서 지원하는 쿼리 연산자는 다음과 같다.
표준 쿼리 연산자 API는 또한 컬렉션을 다른 유형으로 변환하는 특정 연산자를 지정한다.[3]
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
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의 사상에 감화된 사람들에 의해, 마이크로소프트 계열 프로그래밍 언어에 국한되지 않고 다양한 프로그래밍 언어에서 구현되고 있다.
참조
[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