Reputation: 3512
I think that there's a similar post on here about this but not exactly the same...
I have two entities in my EF model - let's call them Person and Developer, with the latter inheriting from the former.
I also have an association on Developer called Qualifications. This is not visible on the Person entity.
If I'm writing a query against the context, how do I automatically .Include () the Qualifications of the Developer e.g.
from employee in context.Employee .Include ("Qualifications") select employee
doesn't work... EF complains that the relationship does not exist (I assume because it does not exist on Employee - but there's no Developer entity on the context, just Employee).
Upvotes: 10
Views: 11396
Reputation: 8482
In EntityFramework Core 8.0 (maybe earlier, I didn't test), you can do it like this:
context.Persons.Include(p => (p as Developer)!.Qualifications)
This will load all persons, and eagerly load the Qualification
relation only for developers.
Upvotes: 0
Reputation: 487
Based on Tri Q's answer, but for the ones that prefer the '.Load()' approach, you can use:
context.Persons.OfType<Developer>().Include(t => t.Qualifications).Load();
I use it inside my DbContext. I created LoadDb() method, that loads all the data I need. So I can use it from many projects.
Upvotes: 3
Reputation: 5690
I've come across this problem and experimented a little. Here is what i found worked using LINQ 2 Entity.
Say we have in your example Person <-- Developer ---- Qualifications.
If you would like to select a Developer with Qualifications included, you would do this.
var dev = (from d in context.Persons.OfType<Developer>
.Include("Qualifications")
where d.ID == id
select d).FirstOfDefault();
Now lets say we have another association between Person and Address, we can also include Address into the select also using LINQ 2 Entity.
var dev = (from d in context.Persons
.Include("Address")
.OfType<Developer>()
.Include("Qualifications")
where d.ID == id
select d).FirstOfDefault();
Notice how I have included the things I needed before I converted the Type and also included again after the conversion. Both includes should now work together without any problems. I have tested these methods and they both work. I hope they work for you given you have your inheritance setup correctly.
GL.
Upvotes: 14
Reputation: 20924
How about this:
var results = from developer in ctx.Employee.OfType<Developer>()
select new {developer, Qualifications = developer.Qualifications};
To things are interesting here:
if you subsequently do this:
var developers = from anon in developers.AsEnumerable()
select anon.Developer;
You will get just developers, and they will have their Qualifications loaded too.
See Tip 1 for more info on why this works
Hope this helps
Alex
Upvotes: 3
Reputation: 43094
I'm not familiar with EF but this looks to me like a standard inheritance problem. If you want to access the unique properties of a child class from a collection of 'parent' objects (where the actual objects may or may not be instances of the child class) then you need to check the object type and cast it to the child where appropriate, then you can access the unique properties.
What would you expect the given statement to return if some or all of the objects were person not developer?
Upvotes: 0