2

我有MySQL中的表结构,建立与外键:LINQ到实体返回错误ID为实体的孩子的孩子

期限{ID,标题}

活动{ID,标题, PeriodId}

资源{ID,文件名}

ActivityResources {ActivityId,RESOURCEID}

这是与LINQ-to-Entities一起建立的,我检查了表映射是正确的,包含了多对多的关系。通常情况下,所有类都可以使用Period,ActivityResource类。

不过,我想使用此代码:

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是正确的)。

任何想法是怎么回事?

编辑

顺便说一句,这工作得很好 - 但我仍然有兴趣在上面的代码probem。

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(); 
} 
+0

所以,它是写activity.id而不是resource.id? – ivowiblo

回答

0

我不认为你可以参考一个孩子/儿童收藏的方式。 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(); 
相关问题