嵌套tph继承成员

时间:2017-01-13 14:39:32

标签: c# entity-framework linq entity-framework-core tph

给出以下类结构

 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();
            }
     }

2 个答案:

答案 0 :(得分:6)

目前无法在父查询中完成此操作,但可以使用EntryCollectionQuery,{{1}的组合来改进显式加载} / IncludeThenInclude来电:

Load

答案 1 :(得分:5)

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

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