Entity framework 实体框架二级包括在预测中
我想在单个查询中检索一组对象(Entity framework 实体框架二级包括在预测中,entity-framework,linq-to-sql,Entity Framework,Linq To Sql,我想在单个查询中检索一组对象(a)和一些相关对象(B)。A和B上没有导航属性,因此我认为需要使用以下语法: 从db.As中选择a,其中a.Id=x选择new和bHolder { A=A, Bs=从db.Bs中选择b,其中b.ASomeId==A.SomeId选择b } 我不确定这是否是最好的方法,但它确实有效。但是,我现在需要包含一个B(一个Cs的列表)属性。我没想到它会起作用,但我试着: 从db.As中选择a,其中a.Id=x选择new和bHolder { A=A, Bs=从db.Bs.In
a
)和一些相关对象(B
)。A
和B
上没有导航属性,因此我认为需要使用以下语法:
从db.As中选择a,其中a.Id=x选择new和bHolder
{
A=A,
Bs=从db.Bs中选择b,其中b.ASomeId==A.SomeId选择b
}
我不确定这是否是最好的方法,但它确实有效。但是,我现在需要包含一个B
(一个Cs
的列表)属性。我没想到它会起作用,但我试着:
从db.As中选择a,其中a.Id=x选择new和bHolder
{
A=A,
Bs=从db.Bs.Include(“Cs”)中选择b,其中b.ASomeId==A.SomeId选择b
}
“无法使用类型为“”的实例调用在类型上声明的方法…Include…”失败。接下来,我想在投影中尝试投影:
从db.As中选择a,其中a.Id=x选择new和bHolder
{
A=A,
Bs=从db.Bs中选择b,其中b.ASomeId==A.SomeId选择新b
{
Id=b.Id,
// ...
Cs=从db.Cs中选择c,其中c.BId==b.Id选择c
}
}
由于“不能在LINQ到实体查询中构造实体或复杂类型“
B
”而失败,因为不允许投影到映射对象中。那么,我如何检索填充了Cs
的Bs
,还是不支持二级包含?我是否只需要对数据库进行两次调用,一次用于检索As,另一次用于检索带有Cs
的Bs
?如果使用带有select new
的投影,则不能再使用Include
,它将被忽略。相反,您必须将相关实体添加到投影数据中,例如:
var query = from a in db.As
join b in db.Bs on a.SomeId equals b.ASomeId into bGroup
where a.Id = x
select new AndBHolder
{
A = a,
Bs = bGroup, // Bs must be of type IEnumerable<B>
Cs = bGroup.SelectMany(bg => bg.Cs) // Cs is IEnumerable<C>
};
谢谢你Slauma,我知道Include永远不会是答案,但我现在可以看出我错在哪里了。。。使用into和SelectMany解决了这个问题。
var query = (from a in db.As
join b in db.Bs on a.SomeId equals b.ASomeId into bGroup
where a.Id = x
select new
{
A = a,
Bs = bGroup,
Cs = bGroup.SelectMany(bg => bg.Cs)
})
.AsEnumerable() // DB query gets executed here
.Select(y => new AndBHolder
{
A = y.A,
Bs = y.Bs // the Cs in every B should be populated here
});