Ok, I have tri-leveled entities with the following hierarchy: Course -> Module -> Chapter
Here was the original EF LINQ statement:
Course course = db.Courses
.Include(i => i.Modules.Select(s => s.Chapters))
.Single(x => x.Id == id);
Now, I want to include another entity called Lab which is associated with a course.
How do I include the Lab entity?
I tried the following but it didn't work:
Course course = db.Courses
.Include(i => i.Modules.Select(s => s.Chapters) && i.Lab)
.Single(x => x.Id == id);
Any ideas on including the 2nd Entity?
Any piece of advise or information would be highly appreciated. Thanks!
This question is related to
.net
asp.net-mvc-3
linq
entity-framework
entity-framework-5
this is from my project
var saleHeadBranch = await _context.SaleHeadBranch
.Include(d => d.SaleDetailBranch)
.ThenInclude(d => d.Item)
.Where(d => d.BranchId == loginTkn.branchId)
.FirstOrDefaultAsync(d => d.Id == id);
You can also try
db.Courses.Include("Modules.Chapters").Single(c => c.Id == id);
Include
is a part of fluent interface, so you can write multiple Include
statements each following other
db.Courses.Include(i => i.Modules.Select(s => s.Chapters))
.Include(i => i.Lab)
.Single(x => x.Id == id);
In Entity Framework Core (EF.core
) you can use .ThenInclude
for including next levels.
var blogs = context.Blogs
.Include(blog => blog.Posts)
.ThenInclude(post => post.Author)
.ToList();
More information: https://docs.microsoft.com/en-us/ef/core/querying/related-data
Note:
Say you need multiple ThenInclude()
on blog.Posts
, just repeat the Include(blog => blog.Posts)
and do another ThenInclude(post => post.Other)
.
var blogs = context.Blogs
.Include(blog => blog.Posts)
.ThenInclude(post => post.Author)
.Include(blog => blog.Posts)
.ThenInclude(post => post.Other)
.ToList();
One may write an extension method like this:
/// <summary>
/// Includes an array of navigation properties for the specified query
/// </summary>
/// <typeparam name="T">The type of the entity</typeparam>
/// <param name="query">The query to include navigation properties for that</param>
/// <param name="navProperties">The array of navigation properties to include</param>
/// <returns></returns>
public static IQueryable<T> Include<T>(this IQueryable<T> query, params string[] navProperties)
where T : class
{
foreach (var navProperty in navProperties)
query = query.Include(navProperty);
return query;
}
And use it like this even in a generic implementation:
string[] includedNavigationProperties = new string[] { "NavProp1.SubNavProp", "NavProp2" };
var query = context.Set<T>()
.Include(includedNavigationProperties);
Source: Stackoverflow.com