Entity framework 多态子对象属性上的即时加载 公共类父类 { 公共ICollection子项{get;set;} } 公营儿童 { } 公共班级男生:儿童 { 公共玩具{get;set;} } 公共班级女生:儿童 { 公共图书{get;set;} }
我想给所有的父母和孩子装玩具,给每个孩子装书Entity framework 多态子对象属性上的即时加载 公共类父类 { 公共ICollection子项{get;set;} } 公营儿童 { } 公共班级男生:儿童 { 公共玩具{get;set;} } 公共班级女生:儿童 { 公共图书{get;set;} },entity-framework,inheritance,Entity Framework,Inheritance,我想给所有的父母和孩子装玩具,给每个孩子装书 如何使用Linq Include()编写?无法使用Include完成,但可以通过投影完成-只要您选择这些实体,EF将为您连接导航属性(必须启用更改跟踪): var query=db.Parents.Select(p=>new { 父项=p, //获取父实体的子实体 孩子们, //给父母的孩子们买玩具 Toys=p.Children.OfType()。选择(b=>b.Toy), //为父母的女儿们买书 Books=p.Children.OfType()
如何使用Linq Include()编写?无法使用
Include
完成,但可以通过投影完成-只要您选择这些实体,EF将为您连接导航属性(必须启用更改跟踪):
var query=db.Parents.Select(p=>new
{
父项=p,
//获取父实体的子实体
孩子们,
//给父母的孩子们买玩具
Toys=p.Children.OfType()。选择(b=>b.Toy),
//为父母的女儿们买书
Books=p.Children.OfType()。选择(g=>g.Book),
} );
var results=query.ToArray().Select(at=>at.Parent);
可能重复@GertArnold,这不是重复Children
是多态集合,而不是继承的导航属性。伊恩,你找到解决办法了吗?“我也在看。”上次我看的时候,急切的装载似乎正在改善。我不确定它是否解决了这个问题。:)这在EF6中很容易解决吗?对不起,这方面的情况并没有本质上的改变。+1谢谢。有没有一种方法不需要使用ToArray()
,这样我就可以在IQueryable
上的可链式方法中使用它?当然,只有在枚举查询之后才能投影到at.Parent
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;}
}
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 );