2012-03-22 9 views
2

오늘 조금 이상한 것을 만났습니다.ctx.Object.Select와 obj.Select 사이의 EF 차이

실행 된 SQL 쿼리를보기 위해 미니 프로파일 러를 사용했습니다.

obj.Children.Select (x => x.Prop1) .SingleOrDefault()를 사용할 때 실행 된 쿼리가 모든 열을 가져 오는 것 같습니다. 그러나 ctx.Children.Select (x => x.Prop1 & & x.IDParent == idObj) .SingleOrDefault()는 Prop1 만 가져옵니다.

차이점은 무엇입니까?

obj.Children. ... 

을 그리고 두 번째 쿼리가 여기 excuted됩니다 :

+0

거기에'Where' 절을 사용하지 않으시겠습니까? –

+0

나는 두 경우 모두 어디에 있었는지. 하지만 그것을 포함시키는 것이 적절하지 않다고 생각했습니다. – ra00l

답변

2

첫 번째 쿼리가 여기에 실행됩니다 때문에

... .SingleOrDefault() 

당신은 모든 열이 전체 기업에 대한 첫 번째 쿼리를 얻을 탐색 속성 때문에 지연로드 지연로드으로 인해로드됩니다. 엔티티가로드 된 후 Select이 메모리에 적용됩니다. 데이터베이스 쿼리는 단일 속성으로 투영 할 때이 시점에서 이미 완료되었습니다.

두 번째 쿼리는 실제로 데이터베이스에서 투영 (단일 열 선택)을 수행하며이 열을 초과하여로드하지 않습니다.

+0

Slauma, 대답 해 주셔서 감사합니다. 말된다. – ra00l