2010-04-05 8 views

답변

8

다른 언급했듯이 IntelliSense를 가능하게하고 작업이 실제로 수행 된 것과 동일한 순서로 쿼리를 읽습니다. 먼저 컬렉션을 가져온 다음 필터링 한 다음 필터링 된 결과를 투영합니다.

세 번째 이유는이 순서가 범위 지정 규칙을보다 합리적으로 만듭니다. C#에서는 "왼쪽으로 흘러가는"새로운 범위를 소개하지 않는다는 것을 알 수 있습니다. SQL에서 FROM에 의해 범위로 가져온 물건은 FROM의 왼쪽에 사용됩니다. C# 구문에서는 범위 변수를 명시 적으로 사용해야하므로 변수를 사용하는 코드의 왼쪽에 선언해야합니다. 범위 변수는 쿼리의 다양한 부분에서 범위 내에 있습니다.

범위 지정 규칙에서 이상한 점은 조인 절입니다. 당신이

from c in customers 
join o in orders on c.Id equals o.CustomerId 

...

을 말할 때 c 변수 범위는 onequals하지만 o 사이의 범위에 없습니다. 범위는 여전히 오른쪽으로 흐르고 있지만 경우에 따라 여기 저기에서 하위 절을 건너 뛸 수 있습니다.

7

더 나은 Intellisense를 허용 할뿐만 아니라 실제 작업 순서를 올바르게 반영합니다. 예를 들어 from e in Employees where e.Age > 65 select e.SalaryEmployees.Where(e => e.Age > 65).Select(e => e.Salary)으로 다시 작성됩니다.

Select(e => e.Salary).Employees.Where(e => e.Age > 65)을 쓰는 것은 의미가 없습니다.

6

LINQ는 데이터베이스 관련 작업뿐만 아니라 일반적인 쿼리 및 메모리 내 데이터의 투영을위한 것입니다. 또한 LINQ 쿼리 식 구문이 구문 식 설탕이라는 람다 식과 확장 메서드를 고려하십시오.

var query = from foo in foos 
      where foo.Bar == "Blah" 
      select foo.Id; 

어쨌든

var query = foos.Where(foo => foo.Bar == "Blah").Select(foo => foo.Id); 
기존 쿼리 식의 구문은 람다/확장 구문에 가까운

, 컴파일러는 후자에 전자를 번역되어가 맨 처음에하는 일 중의 하나에 대한 문법 설탕입니다. 실제로 일어나는 일의 순서를 더 잘 설명합니다.

관련 문제