c# - 忽略联接实体的全局查询过滤器

标签 c# linq asp.net-core entity-framework-core

在实现租户和软删除功能时,全局查询过滤器非常方便。
但我的问题是,例如,当我编写带有连接的查询时

dbContext
    .entity1
    .Include("entity2.entity3.entity4")
    .Where(something)
    .select(something)
    .toList();
并且这些实体中的每一个都有全局过滤器,然后在生成的 SQL 中,我为每个 JOIN 得到一个完整的子查询,它选择该实体的所有字段并检查全局过滤器。
但我不想那样。我希望全局过滤器仅适用于查询的根实体 (entity1),并且所有其他实体都可以正常加入。
顺便说一句,实体的关系是:
  • 1 个实体 4 -> N 个实体 3
  • 1 实体 3 -> N 实体 2
  • 1 实体 2 -> N 实体 1

  • 在我的例子中,每个实体都设置了它的“租户”字段,当软删除一个实体时,软删除会级联到它的所有子级和子级。
    因为为每个连接检查这些字段完全是在浪费时间。

    最佳答案

    目前你不能忽略 Include 中的查询过滤器.有an issue在 EF Core 存储库上关于改进查询过滤器,但它不会进入 EF Core 5。
    一种可能有帮助的方法是运行多个查询并依靠 EF Core 的关系修复功能将事物连接在一起(我在我的文章 EF Core In depth – what happens when EF Core reads from the database? 中解释了关系修复)。
    这是执行两个查询的示例,其中关系修复将连接在一起。

    var mainEntities = dbContext.entity1
       .Where(something)
       .Select(something) //But must contain the ent1 primary key, e.g. Id
       .ToList();
    var ent2list = dbContext.entity2.IgnoreQueryFilters()
       .Include("entity3.entity4")
       .Where(ent2 => mainEntities.Select(ent1 => ent1.Id).Contains(ent2.Id)
       .ToList();
    
    在此 EF Core 的关系修复结束时,将填充相应 entity1 实例中的 entity2 导航属性。注意:如果您使用 AsNoTracking,关系修复不起作用.

    关于c# - 忽略联接实体的全局查询过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63216117/

    相关文章:

    c# - 我应该为此方法抛出异常吗?

    c# - DataGridViewSelectedCellCollection 上的 LINQ 查询

    c# - Linq 表达式。帮助最小化代码

    mongodb - 如何将Bson ObjectId添加到JObject

    c# - 外键引用对象返回 null

    C# 在不指定路径的情况下移动文件

    c# - String.Format 和 TimeSpan 问题

    c# - Linq to SQL 工具 - 如何将其用于 ASP .NET CORE 2.1 项目?

    c# - SQL > Linq to Sql,SQL 查询有效,Linq to SQL 返回空数据集

    c# - 升级到 ASP.NET MVC6 beta 7 后打开现有项目时出现异常