Entity Framework 6 表达式修改

Entity Framework 6 expression modification

我想从 IQueryable 的表达式中删除 where 子句。请问我可以这样做吗? 有一个扩展方法将 IQueryable 作为参数。此 IQueryable 包含 where 子句。我想在不过滤的情况下查询总行数。

查询表达式树中的 Where 子句表示为对 Queryable.Where(source, predicate) 扩展方法的调用。

因此您可以使用自定义 ExpressionVisitor 来定位它们并通过返回第一个参数(即 source)来删除它们,如下所示:

public static class QueryableUtils
{
    public static IQueryable<T> RemoveWhere<T>(this IQueryable<T> source)
    {
        var expression = new WhereRemover().Visit(source.Expression);
        if (expression == source.Expression) return source;
        return source.Provider.CreateQuery<T>(expression);
    }

    class WhereRemover : ExpressionVisitor
    {
        protected override Expression VisitMethodCall(MethodCallExpression node)
        {
            // Queryable.Where(source, predicate)
            if (node.Method.DeclaringType == typeof(Queryable) && node.Method.Name == "Where")
                return base.Visit(node.Arguments[0]); // source
            return base.VisitMethodCall(node);
        }
    }
}

请注意,这将删除所有 Queryable.Where 调用,因此请谨慎使用。