2012-10-29 4 views
1

Linq to objects 식은 열거 된 시퀀스의 요소를 반환하는 개체를 반환합니다. 일반적으로 지연된 LINQ-to-Object 메서드는 파이프 라인으로 작동하므로 시퀀스의 각 요소는 다음 요소가 처리되기 전에 처리 파이프 라인을 통과합니다.Linq-to-Objects 쿼리와의 혼동으로 인해 Linq-to-Entities 쿼리의 결과가 작동하지 않습니다.

a) 그러나 Linq에 투 사물 쿼리가 Linq에 대 엔티티 쿼리 결과에서 작동하는 경우, 다음 foreach 시도가 search을 반복 할 때, 또 각 요소는 전체 처리 시퀀스 흐르지 않는 다음의 요소가 처리되기 전에 (다시 말하면 DB에서 검색된 시퀀스의 첫 번째 요소이고 Enumerable.Where에 의해 처리 된 다음 Enumerable.SelectMany에 의해 처리 된 다음 DB에서 다음 요소 만 검색 됨) 또는 DB에서 한 번에 검색된 전체 요소 집합입니다 (foreach이 시퀀스에서 첫 번째 요소를 읽는 경우에만) 이러한 요소는 Linq-to-Objects 연산자의 처리 파이프 라인을 통해 흐르기 시작합니까?

 var search = context.Contacts.AsEnumerable(). 
      Where(s => s.ContactID > 10).SelectMany(s => s.Address); 

답변

1

먼저 context.Contacts SQL로 (IQueryable에서) 표현을 변환하는 EF 쿼리 공급자에 의해 처리됩니다 감사합니다.

그런 다음에 의해 EF 쿼리 공급자와의 연결이 끊어지고 그 이후의 모든 항목은 위의 명령문에서 결과 집합을 처리하는 개체에 대한 linq입니다.

그러나 Contact.Address은 지연로드 모음이므로 파이프 라인을 전달하는 각 Contact에 대해 새 쿼리가 생성되어 채워집니다. 이는 EF가 Contact의 프록시 유형을 사용하므로 EF 쿼리 공급자를 통해 쿼리를 실행하는 getter가 Address을 무시하므로 가능합니다.

아마 알다시피 AsEnumerable을 지울 때 전체 문은 Expression 트리가되어 하나의 SQL 문으로 변환됩니다.

+0

1) 집합 전체가 한 번에 DB 형식으로 검색되고 Enumerable 연산자가 요소 처리를 시작합니까? 2)이 쿼리를 사용하더라도 올바른가 Enumerable 연산자는 모든 Enumerable 연산자가 이전 요소 처리를 마쳤을 때만 특정 요소 처리를 시작합니까? – carewithl

+1

db 쿼리가 실행되고'AsEnumerable' 후에 linq 문의 모든 체인이 하나의 파이프 라인으로 평가됩니다. 전체 문장 (db 부분 포함)은 실제로 열거 된 경우에만 실행된다는 것이 분명해야합니다. –

+0

"하나의 파이프 라인"으로 무엇을 의미하는지 물어볼 수 있습니까? – carewithl