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