public static IQueryable AppendWhere(IQueryable src, CriteriaOperator op) { var converter = new CriteriaToExpressionConverter(); if (object.ReferenceEquals((object)op, (object)null)) { return(src); } ParameterExpression thisExpression = Expression.Parameter(src.ElementType, ""); Expression expression = Expression.Quote(Expression.Lambda(converter.Convert(thisExpression, op), new ParameterExpression[1] { thisExpression })); MethodCallExpression methodCallExpression = Expression.Call(typeof(Queryable), "Where", new Type[1] { src.ElementType }, new Expression[2] { src.Expression, expression }); return(src.Provider.CreateQuery(methodCallExpression)); }
protected override Expression VisitMethodCall(MethodCallExpression node) { if (node.Method.Name == "Where") { var converter = new CriteriaToExpressionConverter(); var elementType = node.Method.ReturnType.GetGenericArguments()[0]; ParameterExpression thisExpression = Expression.Parameter(elementType); var criteria = DataServiceQueryCriteriaVisitor.Prepare(_filter); if (criteria is FunctionOperator && criteria.ToString().Contains("IsPriorDays")) { var priorDays = (FunctionOperator)criteria; BinaryOperator prirOperator = new BinaryOperator(); prirOperator.LeftOperand = priorDays.Operands[1]; int timeSpan = int.Parse(priorDays.Operands[2].ToString()) * (-1); prirOperator.RightOperand = new ConstantValue(DateTime.Now.AddDays(timeSpan)); prirOperator.OperatorType = BinaryOperatorType.Less; criteria = prirOperator; } else if (criteria is GroupOperator && criteria.ToString().Contains("IsPriorDays")) { var groupOperator = (GroupOperator)criteria; var priorDays = (FunctionOperator)groupOperator.Operands[0]; BinaryOperator prirOperator = new BinaryOperator(); prirOperator.LeftOperand = priorDays.Operands[1]; int timeSpan = int.Parse(priorDays.Operands[2].ToString()) * (-1); prirOperator.RightOperand = new ConstantValue(DateTime.Now.AddDays(timeSpan)); prirOperator.OperatorType = BinaryOperatorType.Less; criteria = prirOperator; } var expression = Expression.Lambda(converter.Convert(thisExpression, criteria), thisExpression); Expression filterExpression = Expression.Quote(expression); return(Expression.Call(node.Method, node, filterExpression)); } return(base.VisitMethodCall(node)); }
public Expression Convert(ParameterExpression thisExpression, DevExpress.Data.Filtering.CriteriaOperator op) { var converter = new CriteriaToExpressionConverter(); Expression expression = converter.Convert(thisExpression, op); var visitor = new NullPropagationEraseViistor(); return(visitor.Visit(expression)); }