嵌套tphinheritance成员的ef-core load collection属性

给出以下类结构

public class Parent { public Guid Id { get; public List Children { get; set; } } public abstract class BaseChild { public int Id { get; set; } public string ChildName { get; set; } } public class NormalChild : BaseChild { public DateTime BirthDate { get; set; } } public class RichChild : BaseChild { public List OffshoreAccounts { get; set; } } public class OffshoreAccount { public string AccountNumber { get; set; } public AccountInfo AccountInfo { get; set; } } 

查询父数据以包含有关子女离岸账户的信息的最佳方法是什么? 我想出了下面的解决方案,使用ef-core的显式加载,但它感觉不对。 有更优雅的解决方案吗?

 var parent = Context.Set() .Where(o => o.Id == Guid.Parse(parentId)) .Include(o => o.Children) .SingleOrDefault(); foreach (var child in parent.Children.OfType()) { Context.Entry(child).Collection(f => f.OffshoreAccounts).Load(); foreach (var account in child.OffshoreAccounts) { Context.Entry(account).Reference(f => f.AccountInfo).Load(); } } 

目前在父查询中无法实现这一点,但可以通过使用EntryCollectionQueryInclude / ThenIncludeLoad调用的组合来改进显式加载:

 var parent = Context.Set() .Where(o => o.Id == Guid.Parse(parentId)) .Include(o => o.Children) .SingleOrDefault(); Context.Entry(parent).Collection(e => e.Children) .Query().OfType() .Include(e => e.OffshoreAccounts) .ThenInclude(e => e.AccountInfo) .Load(); 

在当前的EFCore(2.1.1)中,您可以在ThenInclude使用类型转换来获取您正在寻找的结果:

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