【问题标题】:How to user "Where" in "Include" and "Select" query in Entity Framework 6如何在实体框架 6 中的“包含”和“选择”查询中使用“位置”
【发布时间】:2019-10-12 19:52:20
【问题描述】:

在我的数据库中,我有 3 表、ExamsExamPlacesAgentsExams 表中每个考试的 Id 是 ExamPlaces 表中的外键,每个考试地点的 Id 是 Agents 中的外键强>表。我想退回特定代理的所有考试。我试图这样返回考试:

return _db.Exams
            .Include(e => e.ExamPlaces.Select(a => a.Agents
                .Where(agent => agent.AgentId == supervisorId))).ToList();

但我收到以下错误:

包含路径表达式必须引用在类型上定义的导航属性。对引用导航属性使用虚线路径,对集合导航属性使用 Select 运算符。参数名称:路径

是否可以像使用“Include”一样使用“Where”子句来检索数据?

欣赏

【问题讨论】:

  • 在包含之外的地方进行过滤。
  • 在包含中,您只能指定加载导航属性(以实现存储在不同表中的内容)。对你来说可能(e => e.ExamlPlaces)。您不能过滤以“有时”执行此操作。无法获得考试列表,有时会加载代理,有时不会加载。总是或永远不会。

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


【解决方案1】:

如您所见,EF 6 不支持在 Include 方法中进行过滤。

免责声明:我是项目的所有者Entity Framework Plus

EF+ Query IncludeFilter(免费和开源)允许轻松过滤包含的实体。

要使用它,您只需将所有“Include”替换为“IncludeFilter”即可。此时您还需要在每个级别上使用 IncludeFilter。

例子:

return _db.Exams
            .IncludeFilter(e => e.ExamPlaces)
            .IncludeFilter(e => e.ExamPlaces.Select(a => a.Agents
                .Where(agent => agent.AgentId == supervisorId))).ToList();

【讨论】:

    【解决方案2】:

    包含不影响返回哪些记录。它支持预先加载指定的导航属性。从本质上讲,这是一种说法,“是的,我想要一些考试,但我稍后也会使用相应的 ExamPlaces,所以现在就从数据库中获取它们以节省时间”。它与Where无关。

    在这种特殊情况下,很难使用 Where。这与包含无关。如果您真的想从 _db.Exams 开始并使用 Where,我认为您可以在 Where 之前的某处放置 Join 以使其工作。

    但是,反过来想这个查询。你已经有了你想要的代理。该代理有一个ExamPlaces 集合,每个ExamPlaces 都有一个Exams 集合。您只需要将它们展平到一个列表中。这样的东西应该可以工作(不检查语法错误):

    return _db.Agents
            .Find(supervisorId)
            .ExamPlaces
            .SelectMany(p => p.Exams)
            .Include(e => e.ExamPlaces.Select(p => p.Agents))
            .ToList();
    

    【讨论】:

    • 感谢您的重播。实际上,ExamPlaces 表有一个 Agent 集合,Exams 有一个 ExamPlaces 集合。因此,在 .ExampPlaces 之后的代码中,我没有 SelectMany() 选项。
    • 啊。我错过了 Agent 在 ExamPlace 中的外键,所以这是一对多而不是多对多的关系。这让事情变得更简单了。
    • 等等。 Agent 持有引用 ExamPlace 的外键,ExamPlace 持有引用 ExamPlace 的外键?这意味着每个代理都有一个ExamPlace,其中有一个考试。 _db.Agents.Find(supervisorId).ExamPlace.Exam 将返回与该代理对应的 一个 考试。
    • 每个ExamPlace 都持有Exams 的外键,每个Agent 都持有ExamPlaces 的外键。
    猜你喜欢
    • 2010-12-12
    • 2017-10-08
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多