ef-core load collection property of nested tph inherited member

In the current EFCore (2.1.1) you can use type casting in ThenInclude to get the results you're looking for:

var parent = _context.Set<Parent>()
                 .Include(x => x.Children)
                 .ThenInclude(y => (y as RichChild).OffshoreAccounts)
                 .SingleOrDefault();

Update (EF Core 2.1+):

Starting with v2.1, EF Core native supports Include on derived types through C# cast or as operators.

e.g

.Include(e => e.Children)
    .ThenInclude(e => ((RichChild)e).OffshoreAccounts)
        .ThenInclude(e => e.AccountInfo)

or

.Include(e => e.Children)
    .ThenInclude(e => (e as RichChild).OffshoreAccounts)
        .ThenInclude(e => e.AccountInfo)

The documentation claims that the string overload of Include coudld also be used, e.g. according to it

.Include(e => "Children.OffshoreAccounts.AccountInfo")

should also work, but it doesn't (checked up to v3.1.4).

Original:

Currently there is no way to accomplish that in the parent query, but the explicit loading can be improved by using a combination of Entry, Collection, Query, Include / ThenInclude and Load calls:

var parent = Context.Set<Parent>()
    .Where(o => o.Id == Guid.Parse(parentId))
    .Include(o => o.Children)
    .SingleOrDefault();

Context.Entry(parent).Collection(e => e.Children)
    .Query().OfType<RichChild>()
    .Include(e => e.OffshoreAccounts)
        .ThenInclude(e => e.AccountInfo)
    .Load();