【发布时间】:2019-05-30 12:26:43
【问题描述】:
我想从 IQueryable 的表达式中删除 where 子句。请问我可以这样做吗? 有一个扩展方法将 IQueryable 作为参数。此 IQueryable 包含 where 子句。我想在不过滤的情况下查询总行数。
【问题讨论】:
标签: c# entity-framework-6 expression iqueryable
我想从 IQueryable 的表达式中删除 where 子句。请问我可以这样做吗? 有一个扩展方法将 IQueryable 作为参数。此 IQueryable 包含 where 子句。我想在不过滤的情况下查询总行数。
【问题讨论】:
标签: c# entity-framework-6 expression iqueryable
查询表达式树中的 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 调用,因此请小心使用。
【讨论】: