在实现租户和软删除功能时,全局查询过滤器非常方便。
但我的问题是,例如,当我编写带有连接的查询时
dbContext
.entity1
.Include("entity2.entity3.entity4")
.Where(something)
.select(something)
.toList();
并且这些实体中的每一个都有全局过滤器,然后在生成的 SQL 中,我为每个 JOIN 得到一个完整的子查询,它选择该实体的所有字段并检查全局过滤器。但我不想那样。我希望全局过滤器仅适用于查询的根实体 (entity1),并且所有其他实体都可以正常加入。
顺便说一句,实体的关系是:
在我的例子中,每个实体都设置了它的“租户”字段,当软删除一个实体时,软删除会级联到它的所有子级和子级。
因为为每个连接检查这些字段完全是在浪费时间。
最佳答案
目前你不能忽略 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/