【发布时间】:2017-01-13 14:39:31
【问题描述】:
给定以下类结构
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();
}
}
【问题讨论】:
-
请将
childs重命名为children。 -
什么是
AccountInfo? -
为了避免加载相关实体的代码开销,您应该让 EF 通过启用 EF 延迟加载或急切加载来完成这项工作。在这里查看更多信息:msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx
-
@Felix 目前 EF Core 中没有延迟加载,也没有急切加载派生类属性的语法。
标签: c# entity-framework linq entity-framework-core tph