【问题标题】:Entity Framework 6 expression modification [closed]实体框架6表达式修改[关闭]
【发布时间】:2019-05-30 12:26:43
【问题描述】:

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

【问题讨论】:

    标签: c# entity-framework-6 expression iqueryable


    【解决方案1】:

    查询表达式树中的 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 调用,因此请小心使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多