2011-11-03 6 views
0

1 케이스실행 흐름

var numbers = new List<int>(); 
numbers.Add (1); 
IEnumerable<int> query = numbers.Select (n => n * 10); // Build query 
numbers.Add (2); 

//Use or execute query 

case2 제 경우 쿼리 2 케이스 질의 모두 1,2-

만 1,2- 포함 포함 이유

var numbers = new List<int>() { 1, 2 }; 
numbers.Add(4); 
List<int> query = numbers 
    .Select (n => n * 10) 
    .ToList();      // Executes immediately into a List<int> 
numbers.Add(3); 
numbers.Clear(); 

//Use or execute query 

, 우리가 .ToList() 메소드를 호출하기 때문에 3이 아니라 4가됩니다.

답변

5

이 쿼리가

IEnumerable<int> query = numbers.Select (n => n * 10); 

아무것도 실행하지 않습니다 당신은 결과 집합을 통해 열거하기 시작할 때까지 (어느 쪽인지를 호출 .ToArray(), .ToList()에 의해, 또는 단순히 foreach는 쓰기)가 실행되지 않기 때문입니다 . LINQ의 게으른 특성입니다.

+0

선택 영역 내의 코드에 중단 점을 넣으면 이것을 볼 수 있습니다. 쿼리가 열거 된 후에 만 ​​중단됩니다. –

1

IEnumerable<T>을 반환하는 모든 Linq 메서드는 지연됩니다. 즉, 열거 될 때까지 항목을 반환하지 않습니다.

ToList<T>()은 비 지연 조작입니다.

0

case1 열거 후에 쿼리가 실행되었습니다. case2에서

query 변수 (AN IEnumarable 객체 인) 이미 쿼리를 실행 한 길게는 결과이기 때문에 결과가 3 포함되어 있지 않습니다 (그리고 그것이 Linq Query 대상이 아닙니다.)

0

LINQ 사용하는 늦은 실행의 개념은 .first .list와 같은 실제 작업을 호출 할 때만 쿼리를 실행한다는 것을 의미합니다.

0

linq은 .tolist()가 호출 할 때만 DB를 호출하고 actul 데이터를 반환합니다.

+0

여기에 데이터베이스가 없습니다. – Richard