【问题标题】:Filtering after i have done a ThenInclude in Entity Framework Core在我在 Entity Framework Core 中完成 ThenInclude 之后进行过滤
【发布时间】:2019-09-25 20:53:39
【问题描述】:

我有几张桌子,例如:

用户 -> 用户角色 -> 角色

我正在使用 EF Core 2

我有一个类似的查询

_dbContext.User.Include(x=>x.UserRoles).ThenInclude(y=>y.Roles).Where(x.Active)

角色表还有一个 active(bool) 列。

我如何过滤角色以仅在 active 为 true 的情况下返回。 我是否需要做一些复杂的 where 条件遍历所有表,因为我无法访问 where 子句中的角色变量。

这在 EF Core 3 中会更容易吗?

【问题讨论】:

    标签: entity-framework-core


    【解决方案1】:

    默认情况下,EF Core 不支持在 Include 方法中进行过滤。它在 EF Core 3.x 中也不支持它

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

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

    尚不支持ThenInclude,但您只需包含最后一个过滤器即可获得相同的行为。

    例子:

    _dbContext.User
        .IncludeFilter(x=>x.UserRoles)
        .IncludeFilter(x=>x.UserRoles.SelectMany(y => y.Roles.Where(z => z.Active)))
    

    【讨论】:

    • 谢谢 - 在阅读了 github 上的很多论坛和资料后,我发现这是 EF 团队多年来一直要求的事情,而且他们一直计划在未来做这件事当他们完成重要的事情时。它一直在他们的高优先级列表中,现在位于他们的积压中 - 可能永远不会工作。第三方解决方案似乎是唯一的方法。
    【解决方案2】:

    请注意,这不是一个直接的答案,但如果这是“正常”要求,即您总是或几乎总是只想返回活动角色,您可能需要查看全局过滤器,这是一个存在的功能从 EF Core 2.x 开始。全局过滤器允许您为每个实体设置限制,例如“Active = true”、“IsDeleted = false”等。如果需要,可以关闭全局过滤器。

    至于您的回答,除了查看 Role 实体、过滤它,然后投影回您想要的根实体 AFAIK 之外,没有明显的方法可以做到这一点。

    【讨论】:

    • 谢谢我的想法。我会试试全局过滤器。
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-09
    • 2018-04-26
    相关资源
    最近更新 更多