protected override CamlExpression VisitWhereLogicalExpression(CamlWhereLogicalExpression expression) { CamlLogicalOperator previousOperator = currentOperater; using (new WhereExpressionScope(this, expression.Operator)) { if (expression.Operator == CamlLogicalOperator.Not) { queryBuilder.Append(" -"); Visit(expression.Left); } else { if (previousOperator != expression.Operator) { queryBuilder.Append("("); } Visit(expression.Left); if (expression.Operator == CamlLogicalOperator.Or) { queryBuilder.Append(" OR "); } else { queryBuilder.Append(" "); } Visit(expression.Right); if (previousOperator != expression.Operator) { queryBuilder.Append(")"); } } } return(expression); }
public WhereExpressionScope(KeywordQueryCamlVisitor visitor, CamlLogicalOperator currentOperator) { if (!visitor.whereExpressionScope) { visitor.whereExpressionScope = true; this.query = visitor.query; this.queryBuilder = visitor.queryBuilder; } this.previousOperator = visitor.currentOperater; this.visitor = visitor; visitor.currentOperater = currentOperator == CamlLogicalOperator.Not ? previousOperator : currentOperator; }
/// <summary> /// Called when visiting a logical comparison expression inside a <Where/> element. /// </summary> /// <param name="operatorValue">Type of logical operator.</param> /// <param name="leftExpression">Left expression.</param> /// <param name="rightExpression">Right expression.</param> protected internal abstract void VisitWhereLogicalExpression(CamlLogicalOperator operatorValue, CamlExpression leftExpression, CamlExpression rightExpression);