给出以下类结构
public class Parent
{
public Guid Id { get;
public List<BaseChild> 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<OffshoreAccount> OffshoreAccounts { get; set; }
}
public class OffshoreAccount
{
public string AccountNumber { get; set; }
public AccountInfo AccountInfo { get; set; }
}
查询父数据以包含有关子女离岸账户的信息的最佳方法是什么?我想出了下面的解决方案,使用ef-core的显式加载,但它感觉不对。有更优雅的解决方案吗?
var parent = Context.Set<Parent>()
.Where(o => o.Id == Guid.Parse(parentId))
.Include(o => o.Children)
.SingleOrDefault();
foreach (var child in parent.Children.OfType<RichChild>())
{
Context.Entry<RichChild>(child).Collection(f => f.OffshoreAccounts).Load();
foreach (var account in child.OffshoreAccounts)
{
Context.Entry<OffshoreAccount>(account).Reference(f => f.AccountInfo).Load();
}
}
答案 0 :(得分:6)
目前无法在父查询中完成此操作,但可以使用Entry
,Collection
,Query
,{{1}的组合来改进显式加载} / Include
和ThenInclude
来电:
Load
答案 1 :(得分:5)
在当前的EFCore(2.1.1)中,您可以在ThenInclude
中使用类型转换来获取所需的结果:
var parent = _context.Set<Parent>()
.Include(x => x.Children)
.ThenInclude(y => (y as RichChild).OffshoreAccounts)
.SingleOrDefault();