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 设置的,我检查了表映射是否正确,包括多对多关系。通常,Period
、Activity
和 Resource
类都可以正常工作。
但是,我正在尝试使用此代码:
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
类型的集合not 有Resources
集合。只有一个 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 一起使用的建议