访问child的child,都是1:M

本文关键字:child 访问 都是 | 更新日期: 2023-09-27 18:03:53

试图得到孩子的孩子,两个都有很多关系。

一个CarePeriod有很多DailyExerciseSets,这些DailyExerciseSets有很多exercistrials。carePeriod有DailyExerciseSets的集合,DailyExerciseSets有ExerciseTrials的集合我要写的SQL是

SELECT <bla>
FROM careperiods 
 left outer JOIN DailyExerciseSets ON (...) 
 left outer JOIN exerciseTrials ON (...)
WHERE
 careperiods.bla = bla
 AND DailyExerciseSets.bla = bla
 AND exerciseTrials.bla = bla

只需要在EF/LINQ中复制这个逻辑。我已经围绕这个问题工作了几次,但我真的想看看这是如何实现的。

直觉上我会选择

var x = (from cp in db.carePeriod
.include(cp => cp.DailyExerciseSets) //this bit is fine
.include(cp => cp.DailyExerciseSets.exerciseTrials) //fail...
where (conditions...)
select cp);

但是这个失败了…

如果方向正确就好了。

访问child的child,都是1:M

要包含集合,你需要使用"sub select"而不是点符号:

var x = (from cp in db.carePeriod
             .Include(cp => cp.DailyExerciseSets)
             .Include(cp => cp.DailyExerciseSets.Select(es => es.exerciseTrials))
         where (conditions...)
         select cp);

这里也不需要Include(cp => cp.DailyExerciseSets),因为它已经包含在"子include"中了:

var x = (from cp in db.carePeriod
             .Include(cp => cp.DailyExerciseSets.Select(es => es.exerciseTrials))
         where (conditions...)
         select cp);