如何检测IQueryable< T>有一个where过滤器应用?
在这段代码中,我需要以编程方式知道queryFiltered有一个应用于它的地方而查询没有
IQueryable<Customer> query = Context.Customers; IQueryable<Customer> queryFiltered = Context.Customers .Where(c=>c.Name.Contains("ABC"));
解决方法
您必须解析
IQueryable<T>
实施中从
Expression
property返回的
Expression
.
在爬行Expression树时,您必须查询被调用的Queryable.Where
method.
另请注意,虽然Queryable.Where将是检测where过滤器的最常用方法,但查询语法允许使用其他实现(取决于using
directives中使用的名称空间);如果你有一些没有使用Queryable.Where扩展方法的东西那么你必须明确地寻找它(或者使用更通用的过滤方法来过滤一个带有IQueryable< T>并返回IQueryable< T>的Where方法).
ExpressionVisitor
class(如pointed out by xanatos)提供了一种非常简单的爬行表达式树的方法,我强烈建议使用该方法作为处理表达式树的基础.
值得注意的是,ExpressionVisitor类实现需要在类级别上存储和公开状态.因此,最好(IMO)创建一次性执行操作的内部类,然后使用一个公共方法,每次都创建一个ExpressionVisitor的新实例;这将有助于处理变异状态,如果正确完成,将允许该方法也是线程安全的(如果这是您的关注).