LINQ 란 무엇이며 어떤 역할을합니까? [닫은]


126

LINQ 란 무엇입니까? 데이터베이스 용이라는 것을 알고 있지만 어떤 역할을합니까?


20
나는 "합리적으로 대답 할 수 없다"라는 기준을 통과하지 못했다고 생각합니다. 이 질문을 닫아야 할 이유가 없습니다.
Amy B

1
LINQ의 제작자 인 Erik Meijer의 말을 들어보세요. BTW, 그것은 데이터베이스 단독 이 아닙니다 .
Sнаđошƒаӽ jul.

답변:


171

LINQLanguage Integrated Query의 약자입니다 .

Microsoft 언어 개발자는 YAQL (Yet Another Query Language)을 작성하는 대신 해당 언어 (예 : C # 및 Visual Basic)로 직접 쿼리를 표현하는 방법을 제공했습니다. 이러한 쿼리를 형성하는 기술은 쿼리되는 항목의 구현 세부 정보에 의존하지 않으므로, 기본 방식을 거의 고려하지 않고 여러 대상 (데이터베이스, 메모리 내 개체, XML)에 대해 유효한 쿼리를 작성할 수 있습니다. 쿼리가 실행됩니다.

.NET Framework (3.5)에 속하는 부분으로이 탐색을 시작하겠습니다.

  • LINQ To Objects- System.Linq.Enumerable 에서 쿼리 메서드를 검사 합니다. 이러한 target을 사용 IEnumerable<T>하면 형식화 된 루프 가능 컬렉션을 형식이 안전한 방식으로 쿼리 할 수 ​​있습니다. 이러한 쿼리는식이 아니라 컴파일 된 .NET 메서드에 의존합니다.

  • LINQ To Anything- 일부 쿼리 메서드에 대해 System.Linq.Queryable 을 검사 합니다. 이러한 대상 IQueryable<T>은 기본 구현에 의해 변환 될 수있는 표현식 트리의 구성을 허용합니다.

  • 식 트리 -System.Linq.Expressions 네임 스페이스를 검사 합니다. 이것은 데이터로서의 코드입니다. 실제로는이 점을 알고 있어야하지만 실제로 이러한 유형에 대해 코드를 작성할 필요는 없습니다. 언어 기능 (예 : 람다 식)을 사용하면 다양한 약어를 사용하여 이러한 유형을 직접 처리하지 않을 수 있습니다.

  • LINQ To SQL- System.Data.Linq 네임 스페이스를 검사합니다 . 특히 DataContext. 이것은 C # 팀에서 구축 한 DataAccess 기술입니다. 그냥 작동합니다.

  • LINQ To Entities- System.Data.Objects 네임 스페이스를 검사합니다 . 특히 ObjectContext. 이것은 ADO.NET 팀이 구축 한 DataAccess 기술입니다. LINQ To SQL보다 복잡하고 강력하며 사용하기가 더 어렵습니다.

  • LINQ To XML- System.Xml.Linq 네임 스페이스를 검사합니다 . 본질적으로 사람들은 System.Xml. 따라서 Microsoft는이를 다시 작성하고 다시 작성을 활용하여 XML에 대해 LINQ To Objects를 더 쉽게 사용할 수있는 몇 가지 메서드를 도입했습니다.

  • FuncAction 과 같은 멋진 도우미 유형 . 이러한 유형은 일반 지원이있는 대리자입니다. 사용자 지정 (교환 할 수없는) 대리자 형식을 선언하던 시대는 지났습니다.

위의 모든 내용은 .NET Framework의 일부이며 모든 .NET 언어 (VB.NET, C #, IronPython, COBOL .NET 등)에서 사용할 수 있습니다.


좋습니다. 언어 기능에 대해 알아 보겠습니다. 내가 가장 잘 아는 것이기 때문에 C #을 고수 할 것입니다. VB.NET은 또한 몇 가지 유사한 개선 사항이있었습니다 (그리고 C #에서 얻지 못한 몇 가지-XML 리터럴). 이것은 짧고 불완전한 목록입니다.

  • 확장 방법-입력 할 방법을 "추가"할 수 있습니다. 메서드는 실제로 형식의 인스턴스를 전달하고 형식의 공용 계약으로 제한되는 정적 메서드이지만 제어하지 않는 형식 (문자열)에 메서드를 추가하거나 추가 (완전히 구현) 할 때 매우 유용합니다. ) 인터페이스에 대한 도우미 메서드.

  • 쿼리 이해 구문-SQL Like 구조로 작성할 수 있습니다. 이 모든 것들은 System.Linq.Queryable 또는 System.Linq.Enumerable (myCustomers 유형에 따라 다름)의 메서드로 변환됩니다. 완전히 선택 사항이며 LINQ 없이도 잘 사용할 수 있습니다. 이 스타일의 쿼리 선언의 한 가지 장점은 범위 변수의 범위가 지정된다는 것입니다. 각 절에 대해 다시 선언 할 필요가 없습니다.

    IEnumerable<string> result =
     from c in myCustomers
     where c.Name.StartsWith("B")
     select c.Name;
  • Lambda 표현식-메서드를 지정하는 약어입니다. C # 컴파일러는 각각을 익명 메서드 또는 true로 변환합니다 System.Linq.Expressions.Expression. Linq를 잘 사용하려면 이것을 이해해야합니다. 매개 변수 목록, 화살표 및 메소드 본문의 세 부분이 있습니다.

    IEnumerable<string> result = myCustomers
     .Where(c => c.Name.StartsWith("B"))
     .Select(c => c.Name);`
  • 익명 유형-때로는 컴파일러가 유형을 생성하기에 충분한 정보를 가지고 있습니다. 이러한 유형은 실제로 익명이 아닙니다. 컴파일러는 만들 때 이름을 지정합니다. 그러나 이러한 이름은 컴파일 타임에 만들어 지므로 개발자가 디자인 타임에 해당 이름을 사용하기에는 너무 늦습니다.

    myCustomers.Select(c => new 
    {
      Name = c.Name;
      Age = c.Age;
    })
  • 암시 적 유형-때로는 컴파일러가 유형을 알아낼 수있는 초기화에서 충분한 정보를 가지고 있습니다. var 키워드를 사용하여 컴파일러에 지시 할 수 있습니다. 프로그래머가의 이름을 사용할 수 없습니다 때문에 암시 적 입력은, 익명의 유형에 대한 변수를 선언 할 필요가 익명의 유형입니다.

    // The compiler will determine that names is an IEnumerable<string>
    var names = myCustomers.Select(c => c.Name);

14

LINQ (Language INtegrated Query)는 다음을 참조 할 수 있습니다.

  • 고차 함수를 인수로 광범위하게 사용하는 컬렉션 및 반복기 조 작용 라이브러리 (System.Linq)

  • 추상 구문 트리 (System.Linq.Expressions)로 간단한 함수를 전달하고 조작하기위한 라이브러리

  • 컬렉션 처리를위한보다 SQL과 유사한 구문, 익명 함수에 대한보다 간결한 표기법 및 최종 멤버 함수와 구문 적으로 구별 할 수없는 정적 도우미 함수를 도입하는 메커니즘을 제공하는 다양한 언어에 대한 구문 확장

  • 쿼리 구조를 수신하고 잠재적으로 최적화를 수행하기 위해 데이터 공급자가 준수 할 수있는 인터페이스 정의 또는 때때로 호환되는 데이터 공급자 자체

구성 요소는 분리하여 사용하거나 결합하여 사용할 수 있습니다.


10

간단히 말해 LINQ (언어 통합 쿼리)를 사용하면 코드에서 직접 쿼리를 작성할 수 있습니다. 이러한 쿼리는 관계형 데이터베이스에있을 수 있지만 XML 또는 배열 및 목록과 같은 메모리 내 컨테이너 개체에도있을 수 있습니다. 자세한 내용은 MSDN 라이브러리에서 사용할 수 있습니다. http://msdn.microsoft.com/en-us/library/bb308959.aspx


이것은 정확하고 간결합니다.
SSD

6

간단한 대답을하려고합니다. LINQ는 SQL과 유사하지만 .NET 애플리케이션 내에서 컴파일 할 수있는 쿼리 언어를 사용하여 데이터베이스 (또는 다른 데이터 저장소, XML 등)를 쿼리하는 방법입니다.


1
그렇다면 Linq와 SQL의 차이점은 정확히 무엇입니까?
Kredns

이것에 대한 더 정교한 이름이 있다고 생각하지만 구조가 다릅니다. SQL은 Select From Where이고 LINQ는 From Where Select입니다. LINQ는 루프하기가 더 쉽습니다. LINQ는 더 쉽습니다 :) 그리고 그것이 생성하는 SQL은 일반적으로 시간 절약을 고려할 때 충분히 좋습니다.
jcollum

2
솔직히 말해서, 하나는 SQL을 주장 할 수 있어야 로 기록 될 From Where Select, etc.이 결과 세트가 실제로 형성되는 방식으로 작성해야 즉 -
돈 치들을

6

LINQ는 Language Integrated Query의 약자이며 CLR에서 범용 "쿼리"메커니즘을 제공하는 방법입니다.

가장 기본적인 수준에서 이것은 제한, 프로젝션 등에 사용할 수있는 IEnumerable <T>의 메서드 집합 (예 : Select, Sum, Where)으로 구성됩니다. [1]

좀 더 나아 가기 위해 LINQ는 식 트리를 가져와이를 사용하여 CLR 외부의 데이터 원본 (예 : LINQ to SQL, LINQ to XML, LINQ)에 대해 "기본"쿼리를 실행할 수있는 새로운 LINQ 공급자 모델도 정의합니다. NHibernate 등으로

C # 및 VB.NET은 강력한 형식의 쿼리를 인라인으로 작성할 수있는 쿼리 구문 (SQL과 매우 유사 함)도 정의했습니다. 그러면 컴파일러가이를 동등한 IEnumerable <T> 호출로 변환합니다.

나에게 LINQ에서 가장 흥미로운 점은이를 지원하는 데 필요한 모든 C # 및 VB.NET 기능이 그 자체로 유용하다는 것입니다. 확장 메서드, 익명 형식, 람다 식 및 암시 적 형식은 모두 LINQ를 지원하는 데 필요했지만 순수한 LINQ 컨텍스트 외부에서 이러한 기능을 사용하는 경향이 있습니다.

[1] 그것들은 관계형 용어이며, 함수형 프로그래머는 아마도 Map, Reduce, Fold 등을 선호 할 것입니다.


5

LINQ는 C # 프로그래밍 언어에서 파생 된 관용구를 사용하여 데이터를 추출하는 기술입니다. 기능 설계에서 SQL에 많은 빚을졌지만 기본적으로는 자체 데이터 쿼리 언어입니다. 광범위한 데이터 소스 (SQL 데이터베이스, 메모리 내 표현, XML 등)에서 작동합니다. 특히 LINQ-To-SQL은 SQL 프로그래밍과 C # / VB 프로그래밍 간의 "임피던스 불일치"라고하는 문제를 겪는 기존의 임베디드 SQL 사용과는 대조적으로보아야합니다.

LINQ와 그 제한 사항에 대한 논의를 위해 다음과 같은 관련 질문을 살펴볼 수 있습니다. LINQ to SQL이 요점을 놓치지 않습니까?


0

http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

"LINQ 프로젝트는 언어 통합 쿼리, 설정 및 변환 작업을 포함하는 .NET Framework에 대한 확장 집합에 대한 코드 이름입니다. C # 및 Visual Basic을 쿼리 용 네이티브 언어 구문으로 확장하고 활용할 수있는 클래스 라이브러리를 제공합니다. 이러한 기능. "


그렇다면 데이터베이스 용입니까? 내가 여기서 본 것은 (SO에서) .net 환경의 컬렉션과 더 비슷합니다.
OscarRyz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.