忽略连接实体的全局查询过滤器

M36*_*cro 9 c# linq entity-framework-core asp.net-core

全局查询过滤器在实现租户和软删除功能时非常方便。

但我的问题是,例如,当我编写带有联接的查询时

dbContext
    .entity1
    .Include("entity2.entity3.entity4")
    .Where(something)
    .select(something)
    .toList();
Run Code Online (Sandbox Code Playgroud)

这些实体中的每一个都有全局过滤器,然后在生成的 SQL 中,我为每个 JOIN 获取一个完整的子查询,其中它选择该实体的所有字段并检查全局过滤器。

但我不想要那样。我希望全局过滤器仅适用于查询的根实体(entity1),并且所有其他实体正常加入。

顺便说一句,实体的关系是:

  • 1 个实体4 -> N 个实体3
  • 1 个实体3 -> N 个实体2
  • 1 个实体2 -> N 个实体1

在我的例子中,每个实体都会获得其“租户”字段集,并且当软删除实体时,该软删除会级联到其所有子子实体。因此,检查每个连接的这些字段完全是浪费时间。

Jon*_*ith 9

目前您不能忽略Include. EF Core 存储库上有一个关于改进查询过滤器的问题,但它不会进入 EF Core 5。

\n

一种可能有帮助的方法是运行多个查询并依靠 EF Core 的关系修复功能将事物连接在一起(我在我的文章EF Core 深入 \xe2\x80\x93 中解释了关系修复,当 EF Core 从数据库?)。

\n

这是执行两个查询的示例,其中关系修复将连接在一起。

\n
var mainEntities = dbContext.entity1\n   .Where(something)\n   .Select(something) //But must contain the ent1 primary key, e.g. Id\n   .ToList();\nvar ent2list = dbContext.entity2.IgnoreQueryFilters()\n   .Include("entity3.entity4")\n   .Where(ent2 => mainEntities.Select(ent1 => ent1.Id).Contains(ent2.Id)\n   .ToList();\n
Run Code Online (Sandbox Code Playgroud)\n

在此 EF Core 的关系修复结束时,将在相应的实体 1 实例中填充实体 2 导航属性。注意:如果您使用AsNoTracking.

\n

  • 嗨@Leaky。您可能喜欢我的文章“EF Core 从数据库读取时会发生什么?” https://www.thereformedprogrammer.net/ef-core-in-depth-what-happens-when-ef-core-reads-from-the-database/ 了解有关 EF Core 查询和身份解析的更多信息。 (2认同)