2009-06-03 4 views
9

Załóżmy następującą hierarchię:Entity Framework: Dziedziczenie i Dołącz

class Department { EntityCollection<Employee> Employees; } 

class Employee { string Name; } 

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

Tak, dział zawiera listę pracowników. Istnieje hierarchia typów pracowników, niektóre typy odwołują się do innych podmiotów. Załóżmy, że musimy załadować dział z pracownikami. OK, nie ma problemu:

dataContext.Departments.Include("Employees") 

Powoduje zwrócenie konkretnych typów pracowników (tj. RemoteEmployee for Remote). Teraz musimy załadować Lokalizacja z pracownikami zdalnymi.

dataContext.Departments.Include("Employees").Include("Employees.Location") - Error: no such property in Employee 
dataContext.Departments.Include("Employees").Include("RemoteEmployees.Location") - Error: no such property in Department 

Co powinienem podać w Uwzględnij, aby załadować Lokalizacja za pomocą RemoteEmployee?

+1

Co się stało z roztworem Alexa. Dlaczego nie akceptujesz tego, aby mógł otrzymać z tego nagrodę? – VdesmedT

Odpowiedz

13

Jestem prawie pewien, że sugestie CatZ nie działają.

Nie sądzę, można to zrobić za pomocą obejmują, ale można osiągnąć ten sam efekt, stosując podstęp projekcja zobaczyć ten How to Sort Relationships in the Entity Framework

Co trzeba zrobić, to coś takiego:

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); 
} 

Należy zauważyć, że nie trzeba używać typów anonimowych, aby uzyskać dane, w zasadzie wykonanie projekcji ma efekt uboczny, polegający na wypełnieniu kolekcji w twoim dziale z powodu funkcji Entity Framework o nazwie fixup.

Nadzieja to pomaga Alex

+1

Dzięki, to pomaga. Nie mogę powiedzieć, że jestem zadowolony z tego rozwiązania. Teraz ręcznie ładuję wymagane właściwości, używając: department.Employees.OfType . .ForEach (re => re.LocationReference.Load()); Wydaje się bardziej czytelny, ale przy kosztach prędkości. –

+0

Próbuję wdrożyć powyższe rozwiązanie, ale w powyższym przykładzie, w którym masz 'd.Employees.Select (' moja właściwość nawigacji nie jest zbiorem z powodu wielości, więc nie ma Select (metoda. Jeśli to zamiast tego był jednym pracownikiem, np. 'd.Employee' i chciałem sprawdzić i sprawdzić, czy Pracownik jest określonym typem pochodnym, a jeśli tak, to załadować jego właściwości nawigacyjne. – AaronLS