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(); 
相關問題