在我的数据库中,我有3个表,分别是Exams,ExamPlaces和Agents。考试表中每个考试的ID是ExamPlaces表中的外键,每个考试地方的ID是Agents表中的外键。我想退回特定代理商的所有考试。我试图退回这样的考试:
return _db.Exams
.Include(e => e.ExamPlaces.Select(a => a.Agents
.Where(agent => agent.AgentId == supervisorId))).ToList();
但是我遇到了以下错误:
包含路径表达式必须引用在类型上定义的导航属性。使用虚线路径作为参考导航属性,使用“选择”运算符作为集合导航属性。参数名称:路径
是否可以像我对“ Include”一样使用“ Where”子句来检索数据?
赞赏
答案 0 :(得分:1)
包含不影响返回哪些记录。它使您能够急切加载指定的导航属性。本质上,这是一种表达方式,“是的,我想要一些考试,但是稍后我还将使用相应的ExamPlaces,所以现在就从数据库中获取它们以节省时间”。它与Where无关。
在这种特殊情况下,很难与Where一起使用。与Include无关。如果您真的想从_db.Exams开始并使用Where,我认为您可以在Join之前的某个位置放置一个Join使其起作用。
但是,请反过来考虑该查询。您已经有了所需的代理。该代理具有一个ExamPlaces集合,每个ExamPlaces都具有一个Exams集合。您只需要将它们拼合到一个列表中即可。这样的事情应该起作用(不检查语法错误):
return _db.Agents
.Find(supervisorId)
.ExamPlaces
.SelectMany(p => p.Exams)
.Include(e => e.ExamPlaces.Select(p => p.Agents))
.ToList();
答案 1 :(得分:1)
您注意到,EF 6不支持在Include
方法中进行过滤。
免责声明:我是项目Entity Framework Plus
的所有者EF + Query IncludeFilter(免费和开源)可轻松过滤包含的实体。
要使用它,只需将所有“过滤器”替换为“ IncludeFilter”。您现在还需要在每个级别上使用IncludeFilter。
示例:
return _db.Exams
.IncludeFilter(e => e.ExamPlaces)
.IncludeFilter(e => e.ExamPlaces.Select(a => a.Agents
.Where(agent => agent.AgentId == supervisorId))).ToList();