Entity Framework: наследование и включение - PullRequest
10 голосов
/ 03 июня 2009

Предположим следующую иерархию:

class Department { EntityCollection<Employee> Employees; }

class Employee { string Name; }

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

Итак, отдел содержит список сотрудников. Существует иерархия типов сотрудников, некоторые типы ссылаются на другие объекты. Предположим, нам нужно загрузить отдел с его сотрудниками. ОК, не проблема:

dataContext.Departments.Include("Employees")

Возвращает конкретные типы сотрудников (т. Е. RemoteEmployee для удаленных). Теперь нам нужно загрузить Location с удаленными сотрудниками.

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

Что я должен указать в поле «Включить», чтобы загрузить местоположение с RemoteEmployee?

1 Ответ

13 голосов
/ 04 июня 2009

Я почти уверен, что то, что предлагает CatZ, не работает.

Я не думаю, что вы можете сделать это с помощью Включить, но вы можете добиться того же эффекта с помощью проекционного трюка, см. Как отсортировать отношения в 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);
}

Обратите внимание, что вам не нужно использовать анонимные типы для получения данных, по сути, выполнение проекции имеет побочный эффект заполнения коллекций в вашем отделе из-за функции Entity Framework, называемой fixup.

Надеюсь, это поможет Alex

...