2009-03-21 3 views
1

이 경우를 상상해() 포함. 하지만 내가 알아 내려고 애쓰는 것은로드되는 자식 위치를 필터링하는 방법입니다. 위치에 3 백만명의 어린이 위치가 있다면 어떨까요?열망 로딩

어쩌면 이렇게 될까요? (ChildLocations가 엔터티 집합이기 때문에 작동하지 않습니다.)

var locations = from Locations in this.LocationDataContext.Locations 
             .Include("ChildLocations")      
       where 
        (Locations.LocationType.ID == 3) && 
        (Locations.ChildLocations.LocationType.ID == 2) 
       select 
        Locations; 

감사합니다.

답변

4

Entity Framework는 부분 완료 인스턴스를 구체화하지 않습니다. 즉, 의 하위 위치 중 일부만으로 위치를 구체화 할 수는 없습니다. 이것은 "불완전한"객체 일 것이고 Entity Framework는 이것을 허용하지 않습니다.

그러나 해결 방법이 있습니다. 만 아니라 위치 자체에서 ChildLocations에서 정보가 필요한 경우, 단지를 선택 : 우리는 단지 ChildLocations을 선택하기 때문에 단지 그들 중 몇 가지 선택에

이 경우
from Locations in this.LocationDataContext.Locations 
where Locations.LocationType.ID == 3 
from ChildLocation in Locations 
where ChildLocation.LocationType.ID == 2 
select ChildLocation; 

, 그것은 OK이다, 완전히 구체화 될 수 있기 때문입니다. 우리가 필요로하는 위치를 구체화 할 때만입니다 모두 아이들.

또 다른 해결 방법은 부분 위치 정보를 익명 형식으로 구체화하는 것입니다. 이렇게하면 위치와 의 ChildLocations에 대한 정보를 얻을 수 있으며 인스턴스는 완전한 형식으로 만 구체화 될 수 있습니다. 실제 위치를 실제로 구현하지 않으므로 전체 내용을 구체화 할 필요가 없습니다.

from Locations in this.LocationDataContext.Locations 
where Locations.LocationType.ID == 3 
select new 
{ 
    ID = Locations.ID, 
    LocationType= Locations.LocationType 
    ChildLocations = from ChildLocation in Locations 
        where ChildLocation.LocationType.ID == 2 
        select ChildLocation 
} 
+0

좋은 설명, 감사합니다. –