gpt4 book ai didi

c# - LINQ to Entities 为实体的 child 的 child 返回错误的 ID

转载 作者:太空宇宙 更新时间:2023-11-03 16:40:36 25 4
gpt4 key购买 nike

我在 MySql 中有一个表结构,设置了外键:

Period { Id, Title }

Activity { Id, Title, PeriodId }

Resource { Id, FileName }

ActivityResources { ActivityId, ResourceId }

这是使用 LINQ-to-Entities 设置的,我检查了表映射是否正确,包括多对多关系。通常,所有这些都适用于 PeriodActivityResource 类。

但是,我正在尝试使用这段代码:

private string ListAttachments(Ctx ctx) {
var resList = new StringBuilder();
var p = ctx.Periods.Include("Activities.Resources").Single(o => o.Id == 1);
foreach (var a in p.Activities) foreach (var r in a.Resources)
resList.Append(r.Id).Append(" - ").Append(r.FileName);
return resList.ToString();
}

但是它并没有像预期的那样为每个资源编写Resource.Id;由于某种原因,它改为写入 Activity.Id(尽管 FileName 是正确的)。

知道发生了什么吗?

编辑

顺便说一下,这工作正常 - 但我仍然对上面代码中的问题感兴趣。

private string ListAttachments(Ctx ctx) {
var resList = new StringBuilder();
var res = ctx.Resources.Where(r => r.LessonActivities.Any(l => l.LessonId == 1)).ToList();
foreach (var r in res) resList.Append(r.Id).Append(" - ").Append(r.FileName);
return resList.ToString();
}

最佳答案

我认为您不能以这种方式引用子/子集合。 Period 对象上的Activities 导航属性是一个集合。并且您不能通过这些对象的集合来引用属于对象实例的属性。

换句话说,Period p 有一个Activities 集合。但是Activity 类型的集合Resources 集合。只有一个 Activity 有一个 Resources 集合。

我不明白的是为什么第一个片段完全有效。

无论如何,要直接从Period 获取Resources 集合,您需要使用SelectMany()。有点像

List<Resource> resources = ctx.Periods
.Where(p=>p.Id == 1)
.SelectMany(p=>p.Activities)
.SelectMany(a => a.Resources)
.ToList();

关于c# - LINQ to Entities 为实体的 child 的 child 返回错误的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7681971/

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