LINQ to Entities为实体的孩子的孩子返回错误的ID

时间:2011-10-07 00:30:43

标签: c# linq entity-framework entity-framework-4 linq-to-entities

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

  

期间{Id,Title}

     

活动{Id,Title,PeriodId}

     

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

知道发生了什么事吗?

修改

顺便说一下,这很好用 - 但我仍然对上面代码中的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();
}

1 个答案:

答案 0 :(得分:0)

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

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

我不明白为什么第一个代码片段起作用。

无论如何,要直接从Resources访问Period集合,您需要使用SelectMany()。像

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