Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Entity Framework: Inheritance and Include

Assume the following hierarchy:

class Department { EntityCollection<Employee> Employees; }

class Employee { string Name; }

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

So, department contains a list of employees. There is a hierarchy of employee types, some types reference other entities. Let's suppose we need to load department with its employees. OK, not a problem:

dataContext.Departments.Include("Employees")

This returns concrete employee types (i.e. RemoteEmployee for Remote ones). Now we need to load Location with Remote employees.

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

What should I specify in Include to load Location with RemoteEmployee?

like image 955
Ruslan Minasian Avatar asked Jun 03 '09 11:06

Ruslan Minasian


1 Answers

I'm pretty sure what CatZ suggests doesn't work.

I don't think you can do this using Include, but you can achieve the same effect using a projection trick see this How to Sort Relationships in the Entity Framework

What you need to do is something like this:

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

Notice that you don't need to use the anonymous types to get the data, essentially doing the projection has a side-effect of filling the collections on you department because of a feature of the Entity Framework called fixup.

Hope this helps Alex

like image 87
Alex James Avatar answered Oct 20 '22 14:10

Alex James