如何在Entity Framework 6中的“包含”和“选择”查询中使用“位置”

时间:2019-10-12 19:52:20

标签: c# asp.net-mvc entity-framework-6

在我的数据库中,我有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”子句来检索数据?

赞赏

2 个答案:

答案 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();