Multi-Level Includes in CodeFirst - EntityFrameWork
Asked Answered
D

1

25

It is working code;

IQueryable<Product> productQuery = ctx.Set<Product>().Where(p => p.Id == id).(Include"Contexts.AdditionalProperties.Field");

But you know that it could not produce compile time error if we made mistake in string statement in "Contexts.AdditionalProperties.Field"

I would like to write code below;

IQueryable<Product> productQuery = ctx.Set<Product>().Where(p => p.Id == id).Include(p => p.Contexts);

But above statement could not give chance to define AdditionalProperties and Field.

What should we do?

I would like to write as more than one include for build query.

Thanks.

Dug answered 20/1, 2011 at 18:18 Comment(0)
E
43

If AdditionalProperties is a single reference to another object:

using System.Data.Entity;
...
IQueryable<Product> productQuery = ctx.Set<Product>()
        .Include(p => p.Contexts.AdditionalProperties.Field)
        .Where(p => p.Id == id);


If AdditionalProperties is a collection then you can use the Select method:

IQueryable<Product> productQuery = ctx.Set<Product>()
        .Include(p => p.Contexts.AdditionalProperties.Select(a => a.Field))
        .Where(p => p.Id == id);

Don't forget to import System.Data.Entity namespace in your class file!

Enneastyle answered 20/1, 2011 at 19:6 Comment(3)
I have to tell you that it was not a fair game... Since I answered this very question a few months ago here. Sorry dude!Enneastyle
Thanks for fast answer! How can I add another where contion for AdditionalProperties which is a List<> type object?Dug
You can't. Include does not let conditional loading on the navigation properties. For that you need to eliminate the Include and load the filtered navigation properties by a Filtered Projection with Anonymous types. Take a look at this thread: https://mcmap.net/q/411848/-conditional-eager-loading/…Enneastyle

© 2022 - 2024 — McMap. All rights reserved.