嵌套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(); } }
目前在父查询中无法实现这一点,但可以通过使用Entry
, Collection
, Query
, Include
/ ThenInclude
和Load
调用的组合来改进显式加载:
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();