Entity Framework - Include Multiple Levels of Properties
For EF 6
using System.Data.Entity;
query.Include(x => x.Collection.Select(y => y.Property))
Make sure to add using System.Data.Entity;
to get the version of Include
that takes in a lambda.
For EF Core
Use the new method ThenInclude
using Microsoft.EntityFrameworkCore;
query.Include(x => x.Collection)
.ThenInclude(x => x.Property);
Entity Framework - Include multiple level properties
Add another Include
call:
entity.TableLevel1.Include(tLvl1=>tLvl1.TableLevel2.Select(tLvl2=>tLvl2.TableLevel3))
.Include(tLvl1=>tLvl1.TableLevel2.Select(tLvl2=>tLvl2.AnotherTableLevel3));
If you want to load related entities that are at the same level you should call Include
extension method for each of them.
Entity Framework Core - Include Multiple Levels of a Property for a Collection
There are two overloads of ThenInclude
, one for the case the previous navigation property is a single entity, and another one for collections:
public static IIncludableQueryable<TEntity, TProperty> ThenInclude<TEntity, TPreviousProperty, TProperty>([NotNullAttribute] this IIncludableQueryable<TEntity, TPreviousProperty> source, [NotNullAttribute] Expression<Func<TPreviousProperty, TProperty>> navigationPropertyPath) where TEntity : class;
public static IIncludableQueryable<TEntity, TProperty> ThenInclude<TEntity, TPreviousProperty, TProperty>([NotNullAttribute] this IIncludableQueryable<TEntity, IEnumerable<TPreviousProperty>> source, [NotNullAttribute] Expression<Func<TPreviousProperty, TProperty>> navigationPropertyPath) where TEntity : class;
You should be able to just use it like this:
Context.AItems.Include(a => a.listB).ThenInclude(b => b.c)
From Microsoft Docs:
Current versions of Visual Studio offer incorrect code completion options and can cause correct expressions to be flagged with syntax errors when using the ThenInclude method after a collection navigation property. This is a symptom of an IntelliSense bug tracked at https://github.com/dotnet/roslyn/issues/8237. It is safe to ignore these spurious syntax errors as long as the code is correct and can be compiled successfully.
EF LINQ include multiple and nested entities
Have you tried just adding another Include
:
Course course = db.Courses
.Include(i => i.Modules.Select(s => s.Chapters))
.Include(i => i.Lab)
.Single(x => x.Id == id);
Your solution fails because Include
doesn't take a boolean operator
Include(i => i.Modules.Select(s => s.Chapters) && i.Lab)
^^^ ^ ^
list bool operator other list
Update
To learn more, download LinqPad and look through the samples.
I think it is the quickest way to get familiar with Linq and Lambda.
As a start - the difference between Select
and Include
is that that with a Select you decide what you want to return (aka projection). The Include is a Eager Loading function, that tells Entity Framework that you want it to include data from other tables.
The Include syntax can also be in string. Like this:
db.Courses
.Include("Module.Chapter")
.Include("Lab")
.Single(x => x.Id == id);
But the samples in LinqPad explains this better.
How can I implement multiple Include in Entity Framework?
Here is the solution. It is based on this.
public static class IQueryableExtensions
{
public static IQueryable<T> IncludeMultiple<T, TProperty>(this IQueryable<T> query,
Expression<Func<T, TProperty>>[] includeDelegates) where T : class
{
foreach (var includeDelegate in includeDelegates)
query = query.Include(includeDelegate);
return query;
}
}
This is the calling:
var pathsA = new Expression<Func<ViewTransaction, object>>[2] { p => p.Account, p => p.Instrument };
var pathsB = new Expression<Func<ViewTransaction, object>>[1] { p => p.Account};
var pathsC = Array.Empty<Expression<Func<ViewTransaction, object>>>();
var a = db.ViewTransactions.IncludeMultiple(pathsA).Single(e => e.Id == 100);
Related Topics
Why Do I Get "'Property Cannot Be Assigned" When Sending an Smtp Email
How to Use Reflection to Invoke a Private Method
Reading an Integer from User Input
Wix Installer Msi Not Installing the Winform App Created With Visual Studio 2017
How to Dynamically Create Generic C# Object Using Reflection
Ado.Net |Datadirectory| Where Is This Documented
Can Attributes Be Added Dynamically in C#
How to Access Random Item in List
Display Lines Number in Stack Trace For .Net Assembly in Release Mode
Deserializing Json Data to C# Using Json.Net
Why Use the 'Ref' Keyword When Passing an Object
How to Spawn a Process and Capture Its Stdout in .Net
What Are the Pros and Cons to Keeping SQL in Stored Procs Versus Code
How to Exclude Property from Json Serialization