protected override Expression VisitBinary(BinaryExpression b) { if (b.NodeType == ExpressionType.Coalesce) { sb.Append("IsNull("); Visit(b.Left); sb.Append(","); Visit(b.Right); sb.Append(")"); } else if (b.NodeType == ExpressionType.Equal || b.NodeType == ExpressionType.NotEqual) { if (b.Left is ConstantExpression) { if (b.Right is ConstantExpression) throw new NotSupportedException("NULL == NULL not supported"); Field field = GetField(b.Right); sb.Append(Equals(field, ((ConstantExpression)b.Left).Value, b.NodeType == ExpressionType.Equal)); } else if (b.Right is ConstantExpression) { Field field = GetField(b.Left); sb.Append(Equals(field, ((ConstantExpression)b.Right).Value, b.NodeType == ExpressionType.Equal)); } else throw new NotSupportedException("Impossible to translate {0}".Formato(b.NiceToString())); } else { sb.Append("("); this.Visit(b.Left); switch (b.NodeType) { case ExpressionType.And: case ExpressionType.AndAlso: sb.Append(b.Type.UnNullify() == typeof(bool) ? " AND " : " & "); break; case ExpressionType.Or: case ExpressionType.OrElse: sb.Append(b.Type.UnNullify() == typeof(bool) ? " OR " : " | "); break; case ExpressionType.ExclusiveOr: sb.Append(" ^ "); break; case ExpressionType.LessThan: sb.Append(" < "); break; case ExpressionType.LessThanOrEqual: sb.Append(" <= "); break; case ExpressionType.GreaterThan: sb.Append(" > "); break; case ExpressionType.GreaterThanOrEqual: sb.Append(" >= "); break; case ExpressionType.Add: case ExpressionType.AddChecked: sb.Append(" + "); break; case ExpressionType.Subtract: case ExpressionType.SubtractChecked: sb.Append(" - "); break; case ExpressionType.Multiply: case ExpressionType.MultiplyChecked: sb.Append(" * "); break; case ExpressionType.Divide: sb.Append(" / "); break; case ExpressionType.Modulo: sb.Append(" % "); break; default: throw new NotSupportedException(string.Format("The binary operator {0} is not supported", b.NodeType)); } this.Visit(b.Right); sb.Append(")"); } return b; }