与えられたクラス構造
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();
}
}
現時点では親クエリでこれを達成する方法はありませんが、 Entry
、 Collection
、 Query
、 Include
/ ThenInclude
、 Load
呼び出しの組み合わせを使用することで、明示的な読み込みを改善できます。
var parent = Context.Set<Parent>()
.Where(o => o.Id == Guid.Parse(parentId))
.Include(o => o.Children)
.SingleOrDefault();
Context.Entry(parent).Collection(e => e.Children)
.Query().OfType<RichChild>()
.Include(e => e.OffshoreAccounts)
.ThenInclude(e => e.AccountInfo)
.Load();
現在のEFCore(2.1.1)では、あなたが探している結果を得るためにThenInclude
型キャストを使うことができます:
var parent = _context.Set<Parent>()
.Include(x => x.Children)
.ThenInclude(y => (y as RichChild).OffshoreAccounts)
.SingleOrDefault();