Linq 또는 Lambda입니까?


105

나는 이것이 Linq라는 것을 압니다.

var _Results = from item in _List
                where item.Value == 1
                select item;

그리고 이것이 Lambda라는 것을 알고 있습니다.

var _Results = _List.Where(x => x.Value == 1);

편집자 주 : 위는 단순한 Lambda가 아니라 술어가 Lambda 인 "Method Syntax"를 사용하는 Linq입니다. 명확하게 말하면, 위의 샘플은 모두 Linq입니다 (원래 게시물은 잘못되었지만 질문을 유발하는 혼란을 설명하기 위해 오류를 남겼습니다).

그러나 Linq는 Lambda의 하위 집합입니까?

겉보기에 동일한 기술이 두 개있는 이유는 무엇입니까?

하나를 선택해야하는 기술적 이유가 있습니까?


답변:


135

이것은 LINQ (쿼리 구문 사용)입니다.

var _Results = from item in _List
                where item.Value == 1
                select item;

이것은 또한 LINQ (메서드 구문 사용)입니다.

var _Results = _List.Where(x => x.Value == 1);

두 가지 유형이 모두 똑같은 코드를 생성 한다는 점은 흥미 롭습니다 . 컴파일러는 사용자가 원하는 방식으로 원하는 것을 표현할 수 있도록하여 서비스를 제공합니다.

그리고 이것은 람다입니다.

x => x.Value == 1

메서드 구문을 사용하도록 선택하면 LINQ는 거의 항상 람다 식 주위에 표시됩니다. 그러나 LINQ람다 는 완전히 다른 두 가지이며 둘 다 자체적으로 사용할 수 있습니다.

업데이트 : svick 바르게 지적 하듯이, 쿼리 구문 LINQ입니다 또한 (앞서 언급 한 바와 같이, 컴파일러는 쿼리 구문에 쓸 수 있지만, 효과적으로 뒤로 메서드 구문으로 변환) 람다 표현식을 사용하여 구현. 이것은 두 맛이 완전히 동등하고 동일한 방식으로 작동한다는 사실을 바탕으로 한 것입니다 (예 : 람다 식으로 인해 클로저 가 생성 될 수 있음 ).


2
쿼리 구문이 배후에서도 람다를 사용한다는 점을 언급 할 가치가 있다고 생각합니다. 폐쇄로 인해 중요 할 수 있습니다.
svick 2011 년

34

둘 다 Linq입니다. 두 번째는 Lambdas를 사용하는 것 입니다.

Lambda는 두 번째 예제에서 Where 함수에 파라미터로 전달하는 인라인 메서드 유형입니다.

이 두 구문의 차이점은 순전히 구문입니다. 메서드 호출을 사용하는 두 번째 linq 스타일은 내부적으로 작동하는 방식입니다. 첫 번째는 더 사용자 친화적이고 더 쉬운 것을 의미하며 컴파일러는이를 백그라운드에서 메서드 호출로 변환합니다. 물론 컴파일러가 복잡한 linq 쿼리에 대해 메서드 스타일로 변환 할 때보 다 약간 다른 해석을 선택할 수 있지만 주어진 쿼리에 대해 동일하게 작동해야합니다.

이 msdn 문서도 관심이있을 수 있습니다. LINQ 쿼리 구문 대 메서드 구문 . 특히 관련성은 다음과 같습니다. "일반적으로 쿼리 구문은 일반적으로 더 간단하고 읽기 쉬우므로 권장합니다. 그러나 메서드 구문과 쿼리 구문간에 의미 상 차이는 없습니다."


6
개인적으로 메서드 구문이 더 읽기 쉽다는 것을 알았습니다. 아마도 대부분의 코드가 "LINQ to Objects"유형이기 때문일 것입니다. 그러나 SQL 경험이 많으면 처음에는 쿼리 구문이 이해하기 더 쉬울 것입니다.
Tom Bushell 2011 년

@Tom Bushell, 심지어 JOIN 구문? 정말?
Jerry Nixon

@Tom Bushell : 저도 요. 나는 MSDN 페이지에서 아마도 그들이 메소드 스타일을 갖는 것보다 그 구문을 개발하는 데 신경을 쓰는 이유를 설명하는 무언가를 의역했습니다. 나는 보통 조인이나 그 밖의 더 복잡한 것 (즉, 대부분 필터링 또는 일대일 매핑 작업)보다는 비교적 기본적인 작업을 수행하고 있습니다.
크리스

@Jerry-Chris처럼 내 LINQ 작업은 지금까지 매우 간단했습니다. SelectMany, Join 또는 GroupJoin을 수행 할 때 일반적으로 Query Syntax가 선호된다는 것을 읽었습니다. 아직 그런 작업을 할 필요가 없었습니다!
Tom Bushell 2011 년

1
내부적으로 "쿼리 구문"은 LINQ to SQL 및 LINQ to Entities 팀에서 "이해 구문"이라고합니다.
DamienG 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.