2009-06-03 7 views
9

는 다음과 같은 계층 구조를 가정 포함은 :엔티티 프레임 워크 : 상속 및

class Department { EntityCollection<Employee> Employees; } 

class Employee { string Name; } 

class RemoteEmployee : Employee { Country Location; EntityReference<Country> CountryReference; } 

그래서, 부서 직원의 목록이 포함되어 있습니다. 종업원 유형의 계층 구조가 있으며, 일부 유형은 다른 실체를 참조합니다. 직원과 함께 부서를로드해야한다고 가정 해 봅시다. 문제가되지 않음 :

이렇게하면 구체적인 직원 유형 (즉, 원격 직원의 RemoteEmployee)이 반환됩니다. 이제 원격 직원과 함께 위치를로드해야합니다.

RemoteEmployee를 사용하여 위치를로드하려면 Include에 무엇을 지정해야합니까?

+1

에게 도움이됩니다. 그가 보상을받을 수 있도록 왜 받아들이지 않는거야? – VdesmedT

답변

13

나는 CatZ가 제안하는 것이 효과가 없다고 확신합니다.

난 당신이 포함 사용하여이 작업을 수행 할 수 있다고 생각하지 않습니다,하지만 당신은 당신이해야 할 것은이 같은 것입니다 투사 트릭이 How to Sort Relationships in the Entity Framework

를 참조하여 같은 효과를 얻을 수 있습니다

var results = from d in ctx.Departments 
       select new { 
        d, 
        employees = d.Employees.Select(
         e => new { 
          e, 
          location = e is RemoteEmployee ? 
            (e as RemoteEmployee).Location : 
            null 
        } 
        ) 
       }; 


foreach (var result in results) 
{ 
    var re = result.d.Employees.First() as RemoteEmployee; 
    Console.WriteLine("{0} {1} works from {2}", 
      re.Firstname, re.Surname, re.Location.Name); 
} 

익명 형식을 사용하여 데이터를 가져올 필요가 없으므로 본질적으로 프로젝션을 수행하면 fixup이라고하는 Entity Framework의 기능으로 인해 부서의 컬렉션을 채우는 부작용이 있습니다.

희망이 알렉스의 솔루션 잘못 무엇 알렉스

+1

감사합니다. 도움이됩니다. 나는이 해결책에 만족한다고 말할 수 없다. 이제 막 필요한 속성을 수동으로로드했습니다. department.Employees.OfType .ForEach (re => re.LocationReference.Load()); 더 읽기 쉽지만 속도는 빠릅니다. –

+0

위의 솔루션을 구현하려고하지만 위의 예제에서'd.Employees.Select (내 탐색 속성이 다중성 때문에 컬렉션이 아니므로 Select (메서드)가 없습니다. 대신에'd.Employee'와 같은 단일 직원이었고 Employee가 특정 파생 된 유형인지 확인하고보고 싶다면 탐색 속성을로드하십시오. – AaronLS