[英]How can I check whether an item of an Entity's child collection exists in another collection with LINQ to Entities?
[英]LINQ to Entities returns wrong ID for an entity's child's child
我在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
是正确的)。
知道发生了什么吗?
编辑
顺便说一句,这可以正常工作-但我仍然对上述代码中的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();
}
我认为您无法以这种方式引用儿童/儿童收藏。 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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.