LINQ는 많은 것, 많은 작은 것의 조합이다.
이 대답은 정보의 혼란이 될 것입니다, 사과드립니다. 최선의 방법은 조금 기다려 다른 사람이 더 잘 요약하는지 확인하고 내가 사용하는 키워드에 대해 google을 수행하는 것입니다.
LINQ"고뇌에서통괄 된큐가장 단순한 해석은 SQL과 유사한 구문을 C #프로그래밍 언어에 추가 한 것입니다.
그래서 대신 :
IEnumerable<int> values = otherValues.Where(i => i > 5);
구문은 다음과 같습니다.
IEnumerable<int> values = from i in otherValues
where i > 5
select i;
C #컴파일러는 실제로 두 번째 코드를 첫 번째 코드로 변환하므로 실제로 컬렉션의 메서드를 호출하는 것입니다.
그러나 여기 퍼즐의 또 다른 부분이 있습니다. 이러한 메소드는 실제로 콜렉션에 정의되지 않습니다. 그것들은 확장 메서드로 정의됩니다. 즉, "다른 프로그래머가 컬렉션 형식에서 정의 된 것처럼이 메서드를 사용하게하고 컴파일하는 동안 코드를 수정하면됩니다. ".
위 코드의 첫 번째 부분은 다음과 같습니다.
IEnumerable<int> values = otherValues.Where(i => i > 5);
실제로 다음과 같이 컴파일됩니다.
IEnumerable<int> values = Enumerable.Where(otherValues, i => i > 5);
Where 메서드가 정의되었습니다.여기 : Enumerable. 어디에서.
다음 마술은 C #컴파일러가 Enumerable을 사용하지 않는다는 것입니다. 여기서 무엇을합니까? 대답은 두 번째 코드 조각처럼 보이도록 코드를 다시 작성하고 일반적인 형식 유추 작업을 수행하도록하는 것입니다. 그것. 즉, 두 번째 코드를 실제로 작성한 것으로 가정하고 "otherValues"가List<T>
어디에T
이다int
, 그런 다음 그것을 찾는다.Enumerable.Where
전화 할 사람입니다.
즉, 컬렉션 이외의 다른 유형의 경우 실제로 Where를 직접 구현할 수 있으며 LINQ 구문은 더 현명하지 못합니다.
이것은 메모리에 실제 모음이 아닌 것을 쿼리 할 수 있다는 것을 의미합니다. 예를 들어, 위의 "otherValues"가 데이터베이스에서 데이터를 가져 오는 방법을 알고있는 경우, 다른 Where 메서드가 호출되며 Enumerable.Where에서는 호출되지 않습니다.
이렇게하면 다른 구현체가 자신의 방식대로 작업을 수행 할 수 있습니다. 예를 들어 SQL을 작성하여 실행하고 결과를 패키징하여 호출 코드를 실제 메모리 콜렉션 인 것처럼 보이도록 만듭니다. ~로 시작하십시오.
다음 마술은 표현입니다. 위의 Where 메서드의 매개 변수,i => i > 5
대부분의 경우 람다 식 또는 익명 메서드이므로 실제로 메모리 내 컬렉션에 대해 이렇게 선언 할 수 있습니다.
Func<int, bool> w = delegate(int i) { return i > 5; };
IEnumerable<int> values = otherValues.Where(w);
그러나 C #의 표현식 지원은 다음과 같이 선언 할 수도 있음을 의미합니다.
Expression<Func<int, bool>> w = i => i > 5;
여기서 컴파일러는 실제로 컴파일 된 코드로 저장하지 않고 하나의 인수를 취하고 5보다 큰 비교 값을 비교하여 결과를 반환한다는 것을 알고있는 메모리 내 데이터 구조입니다. 참고로 위임자가 아닌 람다 방식으로 작성해야합니다.
이 지식은 다른 Where 구현이 표현식을 사용하도록 선언 된 경우 "where 절"을 보유 할뿐만 아니라이를보고 따로 선택하고 다시 작성하도록 허용합니다.
즉, SQL 코드를 처리하는 방법을 알고있는 Where 메서드에서 SQL을 생성 할 수 있습니다.
Where 메서드의 LINQ to SQL 선언은 다음과 같습니다.Queryably.Where.
따라서 LINQ는 C #컴파일러에 추가 된 여러 기술의 조합입니다.
MSDN은 LINQ를 도입하는 데 아주 능숙합니다.
[...]
.NET 언어 통합 쿼리 정의 범용 표준 세트 트래버스를 허용하는 쿼리 연산자, 필터 및 프로젝션 작업을 직접적으로 표현되다. 모든 .NET 기반의 선언적 방법 프로그래밍 언어. 표준 쿼리 연산자는 쿼리를 허용합니다. 모든 IEnumerable 기반 정보 출처. LINQ는 세 번째 허용 당사자들이 표준 세트를 증대시킨다. 새로운 연산자로 쿼리 연산자 도메인 관련 연산자 대상 도메인에 적합하거나 과학 기술. 더 중요한 것은 세 번째 당사자는 또한 표준 쿼리 연산자 제공하는 자체 구현 리모컨과 같은 추가 서비스 평가, 쿼리 번역, 최적화 등. 붙임으로써 LINQ 협약 패턴, 그러한 구현은 즐긴다. 동일한 언어 통합 및 도구 표준 쿼리로 지원 연산자.
[...]
그것은 여러 가지 다른 것들입니다.
Linq, 그것에서 나타나는대로System.Linq네임 스페이스는 코드에서 직접 컬렉션을 쿼리 할 수있는 확장 메서드 집합입니다. "Language INtegrated Query"의 머리 글자입니다.
또한 Linq에서 SQL 로의 SQL, Linq에서 XML 로의 XML 등 다양한 데이터 소스를 쿼리 할 수있게 해주는 공급자 세트입니다.
SQL과 같은 구문을 사용하여 객체를 쿼리한다고 생각하십시오. 다음은에서 복사 된 예제입니다.http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx
public void Linq1()
{
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var lowNums =
from n in numbers
where n < 5
select n;
Console.WriteLine("Numbers < 5:");
foreach (var x in lowNums)
{
Console.WriteLine(x);
}
}
Linq는 to의 IEnumerable에 대한 확장 메소드 모음입니다. 컬렉션에서 오브젝트를 가져 오는 데 필요한 세부 사항을 추상화 할 수있게 해줍니다. Linq를 통해 컬렉션에 '쿼리'를하면,선언적대신에피할 수 없는. 이것이 의미하는 바는, Linq 질의가 정확히 어떻게 얻는 대신에 당신이 얻고 자하는 것을 보여주고 있다는 것입니다. foreach () 루프에서는 결과를 필터링, 그룹화 및 정렬하는 방법에 대해 명시해야합니다. Linq를 사용하면 몇 가지 간단한 문장 일 뿐이며 구현 세부 사항은 사용자로부터 멀리 추상화됩니다.
많은 사람들은 Linq-to-SQL 때문에 SQL과 관련이 있다는 오해를 가지고 있습니다. 그러나 실제로 Linq의 작은 부분입니다. Linq의 힘을 충분히 얻으려면 L2S를 사용할 필요가 없으며 실제로 많은 사람들은 그렇지 않습니다. Linq-to-SQL은 개인적인 견해로는 SQL 서버를 DB로 사용하는 .NET 상점 인 경우 고양이의 야옹입니다.
LINQ
Google에? - Winston Smith