C# 忽略表达式访问者或IDbCommandTreeInterceptor

C# 忽略表达式访问者或IDbCommandTreeInterceptor,c#,entity-framework,entity-framework-6,expressionvisitor,C#,Entity Framework,Entity Framework 6,Expressionvisitor,对于需要软删除的数据库,我们有一个IsActive位列。如果为false,则表示记录已标记为已删除 在99%的时间里,查询应该只包括IsActive设置为true的记录。在EntityFramework6中,我们使用自定义的DefaultExpressionVisitor(通过IDBComandTreeInterceptor)在表中存在列时自动进行此检查 然而,在极少数情况下,这种行为需要被覆盖。有没有一种方法可以为IQueryable编写扩展方法,或者在DbContext上编写表达式访问者或命

对于需要软删除的数据库,我们有一个
IsActive
位列。如果为false,则表示记录已标记为已删除

在99%的时间里,查询应该只包括
IsActive
设置为true的记录。在EntityFramework6中,我们使用自定义的
DefaultExpressionVisitor
(通过
IDBComandTreeInterceptor
)在表中存在列时自动进行此检查

然而,在极少数情况下,这种行为需要被覆盖。有没有一种方法可以为IQueryable编写扩展方法,或者在DbContext上编写表达式访问者或命令树拦截器可以检查的设置

我希望能做一些类似的事情

var query = queryable.IncludeInactive().Where(...);

要影响执行此操作时可能发生的上述行为,请执行以下操作:

var query = queryable.Where(...);

如果可能的话,我更喜欢扩展方法路由。

您可以尝试在自定义DefaultExpressionVisitor上放置一个IsActive属性,当它设置为false时,将其更改为“不发挥作用”,并将该DefaultExpressionVisitor的引用保留到单例中(此单例将遵循与Transaction.Current的静态属性相同的模式,您只需将该单例保留在某个位置,但每个线程使用不同的单例)

创建另一个类(“IncludeInactive”类),该类遵循与TransactionScope相同的模式(它只需实现IDisposable),但在其构造函数上将singleton IsActive属性设置为false,在其Dispose方法中将其设置为true

然后你会这样使用它:

using(var inactive = new IncludeInactive())
{
    var query = queryable.Where(...);
}

您可以尝试在自定义DefaultExpressionVisitor上放置一个IsActive属性,并将其更改为设置为false时不发挥其魔力,还可以将该DefaultExpressionVisitor的引用保留到singleton中(此单例将遵循与Transaction.Current的静态属性相同的模式,您只需将该单例保留在某个位置,但每个线程使用不同的单例)

创建另一个类(“IncludeInactive”类),该类遵循与TransactionScope相同的模式(它只需实现IDisposable),但在其构造函数上将singleton IsActive属性设置为false,在其Dispose方法中将其设置为true

然后你会这样使用它:

using(var inactive = new IncludeInactive())
{
    var query = queryable.Where(...);
}