private void GenerateSqlForInfixOperator (Expression left, Expression right, ExpressionType nodeType, Type expressionType)
{
if (nodeType == ExpressionType.And && BooleanUtility.IsBooleanType (expressionType))
GenerateSqlForInfixOperator (left, right, ExpressionType.AndAlso, expressionType);
else if (nodeType == ExpressionType.Or && BooleanUtility.IsBooleanType (expressionType))
GenerateSqlForInfixOperator (left, right, ExpressionType.OrElse, expressionType);
else if (nodeType == ExpressionType.ExclusiveOr && BooleanUtility.IsBooleanType (expressionType))
{
// SQL has no logical XOR operator, so we simulate: a XOR b <=> (a AND NOT b) OR (NOT a AND b)
var exclusiveOrSimulationExpression = Expression.OrElse (
Expression.AndAlso (left, Expression.Not (right)),
Expression.AndAlso (Expression.Not (left), right));
_expressionVisitor.VisitExpression (exclusiveOrSimulationExpression);
}
else
{
string operatorString = GetRegisteredOperatorString (nodeType);
_expressionVisitor.VisitExpression (left);
_commandBuilder.Append (" ");
_commandBuilder.Append (operatorString);
_commandBuilder.Append (" ");
_expressionVisitor.VisitExpression (right);
}
}