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
调用,因此请谨慎使用。
我想从 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
调用,因此请谨慎使用。