protected override Expression VisitMethodCall(MethodCallExpression node) { Expression expression = node; if (node.Method.Name == "Contains") { var visitor = new SpContainsExpressionVisitor <TContext>(SpQueryArgs); visitor.Visit(expression); Operator = visitor.Operator; } else if (node.Method.Name == "StartsWith") { var visitor = new SpStartsWithExpressionVisitor <TContext>(SpQueryArgs); visitor.Visit(expression); Operator = visitor.Operator; } else if (node.Method.Name == "DateRangesOverlap" && typeof(ListItemEntityExtensions).IsAssignableFrom(node.Method.DeclaringType)) { var visitor = new SpDateRangesOverlapExpressionVisitor <TContext>(SpQueryArgs); visitor.Visit(expression); Operator = visitor.Operator; } else if (node.Method.Name == "Includes" && typeof(ListItemEntityExtensions).IsAssignableFrom(node.Method.DeclaringType)) { var visitor = new SpIncludesExpressionVisitor <TContext>(SpQueryArgs); visitor.Visit(expression); Operator = visitor.Operator; } else if ((node.Method.Name == "LookupIncludes" || node.Method.Name == "LookupIdIncludes") && typeof(ListItemEntityExtensions).IsAssignableFrom(node.Method.DeclaringType)) { var visitor = new SpLookupIncludesExpressionVisitor <TContext>(SpQueryArgs); visitor.Visit(expression); Operator = visitor.Operator; } else if ((node.Method.Name == "LookupNotIncludes" || node.Method.Name == "LookupIdNotIncludes") && typeof(ListItemEntityExtensions).IsAssignableFrom(node.Method.DeclaringType)) { var visitor = new SpLookupNotIncludesExpressionVisitor <TContext>(SpQueryArgs); visitor.Visit(expression); Operator = visitor.Operator; } else if ((node.Method.Name == "IsMembership") && typeof(ListItemEntityExtensions).IsAssignableFrom(node.Method.DeclaringType)) { var visitor = new SpIsMembershipExpressionVisitor <TContext>(SpQueryArgs); visitor.Visit(expression); Operator = visitor.Operator; } if (node.Method.Name == "Equals") { var visitor = new SpComparisonExpressionVisitor <TContext>(SpQueryArgs); visitor.Visit(expression); Operator = visitor.Operator; } else { expression = base.VisitMethodCall(node); } return(expression); }
private SpExpressionVisitor <TContext> GetExpressionVisitor(Expression exp) { SpExpressionVisitor <TContext> expVisitor = null; switch (exp.NodeType) { case ExpressionType.And: case ExpressionType.AndAlso: case ExpressionType.Or: case ExpressionType.OrElse: expVisitor = new SpConditionalExpressionVisitor <TContext>(SpQueryArgs); break; case ExpressionType.Equal: case ExpressionType.NotEqual: case ExpressionType.GreaterThan: case ExpressionType.GreaterThanOrEqual: case ExpressionType.LessThan: case ExpressionType.LessThanOrEqual: expVisitor = new SpComparisonExpressionVisitor <TContext>(SpQueryArgs); break; } return(expVisitor); }