忽略表达式visitor或IDbCommandTreeInterceptor

时间:2016-12-01 19:25:11

标签: c# entity-framework entity-framework-6 expressionvisitor

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

99%的情况下,查询应仅包含IsActive设置为true的记录。在实体框架6中,我们使用自定义DefaultExpressionVisitor(通过IDbCommandTreeInterceptor)在表格中存在列时自动进行此检查。

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

我希望做一些像

这样的事情
var query = queryable.IncludeInactive().Where(...);

_dbContext.IncludeInactive = true;
var query = queryable.Where(...);
_dbContext.IncludeInactive = false;

影响上述行为,否则会在执行此操作时发生:

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

如果可能,我更喜欢扩展方法路线。

1 个答案:

答案 0 :(得分:0)

您可以尝试将IsActive属性设置为自定义DefaultExpressionVisitor,并将其更改为在设置为false时不执行其魔法,并将该DefaultExpressionVisitor的引用保留为单个(此单例将跟随与Transaction.Current的静态属性相同的模式,你只需将该单例保留在某处,但每个线程不同一个。)

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

然后你会像这样使用它:

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