【发布时间】:2015-03-26 23:53:38
【问题描述】:
我想知道为什么 Include() 不能在 Single() 之后在急切加载中使用。例如,在下面的 sn-p 中,Include 不可用:
db.Teachers.Single(p => p.Id == currUserId)
.Include(t => t.OfferedCourses)
.RegisteredCourses
.ToList();
但是,如果我在 Include() 之后有 Single(),它会起作用:
db.Teachers.Include(t => t.OfferedCourses)
.Single(p => p.Id == currUserId)
.RegisteredCourses
.ToList();
这样会返回很多不必要的相关数据。以下是我最终得到的方法:
db.Teachers.Where(p => p.Id == currUserId)
.Include(t => t.OfferedCourses)
.First()
.RegisteredCourses
.ToList();
这是唯一的解决方案吗?
【问题讨论】:
-
.Include()是IQueryable类型的有效扩展方法。当您指定db.Teachers.Include(或db.Teacher.Where( p => p.Id == curreUserId )时,您正确地满足了此要求,因为db.Teachers和db.Teachers.Where()都返回类型IQueryable。您确定您的第二个示例是“过度查询”吗?乍一看,这应该没问题。 -
Single()之后我只得到了Teacher实体的属性,我想Single()把结果转换成一个Teacher实体。 -
没错——
Single()返回实体类型的单个实例。顺便说一句——你的数据模型在发布的代码中并不明显。看起来您正在查询Teacher,其Id与currUserId的值匹配。虽然我可以想象一个用例,其中老师是登录的人(即currUserId),然后您引用RegisteredCourses,这似乎是一个学生属性——但我再次可以想象Teacher具有RegisteredCourses的结构.您可以使用伪代码或英语来描述您尝试使用此查询检索的内容吗?
标签: asp.net entity-framework eager-loading ef-fluent-api