gpt4 book ai didi

entity-framework - Entity Framework 二级包含在预测中

转载 作者:行者123 更新时间:2023-12-04 07:22:53 24 4
gpt4 key购买 nike

我想在单个查询中检索一组对象 (A) 和一些相关对象 (B)。 AB 上没有导航属性,因此我认为我需要使用以下语法:

select a from db.As where a.Id = x select new AndBHolder
{
A = a,
Bs = select b from db.Bs where b.ASomeId == A.SomeId select b
}

我不确定这是否是最好的方法,但它确实有效。但是,我现在需要包含 B 的属性(Cs 的列表)。我没想到它会起作用,但我试过了:

select a from db.As where a.Id = x select new AndBHolder
{
A = a,
Bs = select b from db.Bs.Include("Cs") where b.ASomeId == A.SomeId select b
}

失败并显示“方法 ... Include 在类型上声明 ... 不能用类型 ... 的实例调用”。接下来我想我会尝试在投影中进行投影:

select a from db.As where a.Id = x select new AndBHolder
{
A = a,
Bs = select b from db.Bs where b.ASomeId == A.SomeId select new B
{
Id = b.Id,
// ...
Cs = select c from db.Cs where c.BId == b.Id select c
}
}

失败并显示“无法在 LINQ to Entities 查询中构造实体或复杂类型 'B'”,因为不允许投影到映射对象中。那么如何检索填充了 CsBs,或者是否不支持二级包含?我是否只需要两次调用数据库,一次检索 A,一次检索 B 及其 C

最佳答案

如果您使用带有 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>
};

如果 BC 之间的关系是一对多(不是多对多)EF 应该填充 Cs在每个加载的 B 中自动收集(这称为“关系修复”),这意味着您可以在从数据库加载数据后从投影中丢弃 Cs。要将它们组合在一起,您可以尝试像这样编写查询:

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

关于entity-framework - Entity Framework 二级包含在预测中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11593672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com