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

Posted

技术标签:

【中文标题】LINQ to Entities 为实体的子级返回错误的 ID【英文标题】:LINQ to Entities returns wrong ID for an entity's child's child 【发布时间】:2011-12-02 16:14:20 【问题描述】:

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

期间 ID,标题

活动 ID、标题、PeriodId

资源 ID,文件名

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

【问题讨论】:

那么,它写的是activity.id而不是resource.id? 【参考方案1】:

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

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

我不明白为什么第一个 sn-p 完全有效。

无论如何,要直接从Period 访问Resources 集合,您需要使用SelectMany()。类似的东西

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

【讨论】:

以上是关于LINQ to Entities 为实体的子级返回错误的 ID的主要内容,如果未能解决你的问题,请参考以下文章

在 LINQ to Entities 查询中无法构造实体或复杂类型

LINQ to Entities 无法识别该方法(在相关实体上)

在 LINQ to Entities 查询中无法构造实体或复杂类型

关于将 Flex 与 WCF 和 Linq to Entities 一起使用的建议

在 LINQ to Entities 查询中无法构造实体或复杂类型“Cits.Data.LineImg”。

在LINQ to Entities中不支持指定的类型成员'x'。只支持初始化器实体成员和实体导航属性。