44

I want to get multiple nested levels of child tables in Entity Framework Core using eager loading. I don't think lazy loading is implemented yet.

I found an answer for EF6.

var company = context.Companies
                 .Include(co => co.Employees.Select(emp => emp.Employee_Car))
                 .Include(co => co.Employees.Select(emp => emp.Employee_Country))
                 .FirstOrDefault(co => co.companyID == companyID);

My problem is that Select is not recognized in EF Core

Error CS1061 'Employees' does not contain a definition for 'Select' and no extension method 'Select' accepting a first argument of type 'Employees' could be found (are you missing a using directive or an assembly reference?)

My included namespaces:

using MyProject.Models;
using Microsoft.Data.Entity;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

What is the alternative for Select in EF Core.

dfmetro
  • 3,792
  • 6
  • 34
  • 57
zoaz
  • 1,521
  • 4
  • 13
  • 28

2 Answers2

98

You can use the keyword ThenInclude instead

e.g.

var company = context.Companies
             .Include(co => co.Employees).ThenInclude(emp => emp.Employee_Car)
             .Include(co => co.Employees).ThenInclude(emp => emp.Employee_Country)
             .FirstOrDefault(co => co.companyID == companyID);
devfric
  • 6,566
  • 6
  • 33
  • 51
  • 7
    Am I insane, or does this no longer work in EF Core 1.1.0? .ThenInclude treats the parent as an ICollection, offering me the collection properties instead of a single element's properties :/ – JasonX Feb 07 '17 at 13:22
  • 31
    @JasonX It is a bug in IntelliSense, just write you query as it would be an entity and it will work fine. – Daniel Zolnai Jun 26 '17 at 19:14
  • @DanielZolnai did you report the bug by any chance - or how did you find it? Do you have a link to the GitHub issue? – cdavid Feb 14 '18 at 02:05
  • 1
    @cdavid It's listed [here](https://docs.microsoft.com/en-us/ef/core/querying/related-data#including-multiple-levels) in the docs, and [here](https://github.com/dotnet/roslyn/issues/8237) on github. Unrelated: Painful that I have to do the `.Include` twice for grandchildren from the same child (in your (firste's) case, `Employees`). But excellent example; thanks. – ruffin Feb 23 '18 at 00:54
3

Also, the .ThenInclude intellisense for only works up to the 3rd level, for example:

_Context.A.Include(a => a.B).ThenInclude(B => B.C).ThenInclude(C => C.D)

The last part of that statement:

 .ThenInclude(C => C.D)

won't show "D", so you have to type D in yourself, then wait for a short period of time for the compilation error to disappear!

Chris J
  • 410
  • 5
  • 11