【问题标题】:Eager load on polymorphic child object property多态子对象属性的急切负载
【发布时间】:2013-08-09 11:02:42
【问题描述】:
public class Parent 
{
  public ICollection<Child> Children {get;set;}
}

public class Child
{      
}

public class Boy : Child
{  
  public Toy Toy {get;set;}    
}

public class Girl : Child
{      
  public Book Book {get;set;}
}

我想加载所有父母,并为每个父母加载所有孩子,为每个男孩加载玩具,为每个女孩加载书籍。

如何使用 Linq Include() 编写它?

【问题讨论】:

  • @GertArnold,这不是重复的。 Children 是一个多态集合,而不是继承的导航属性。伊恩,你找到解决办法了吗?我也在看。
  • @kit 上次我查看的急切加载似乎正在改善。我不确定它是否能解决这个问题。 :)
  • 现在使用 EF6 可以轻松解决这个问题吗?
  • 抱歉,这方面的情况基本上没有改变。

标签: entity-framework inheritance


【解决方案1】:

Include 无法完成,但可以通过投影完成 - 只要您选择这些实体,EF 就会为您连接导航属性(必须启用更改跟踪):

var query = db.Parents.Select( p => new
{
    Parent = p,
    // get the children entities for the parent
    Children = p.Children,
    // get the toys for the parent's boys
    Toys = p.Children.OfType<Boy>().Select( b => b.Toy ),
    // get the books for the parent's girls
    Books = p.Children.OfType<Girl>().Select( g => g.Book ),
} );

var results = query.ToArray().Select( at => at.Parent );

【讨论】:

  • +1 谢谢。有没有一种不需要ToArray() 的方法,所以我可以在IQueryable&lt;&gt; 上以链式方法使用它?
  • 当然,只有在枚举查询之后才能投射到at.Parent
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 2016-08-25
  • 1970-01-01
相关资源
最近更新 更多