public async Task Arithmatic_Divide()
 {
     using (var queryResult = await DataProvider.ExecuteReaderAsync(
                QueryExpression.Select(QueryExpression.Divide(
                                           QueryExpression.Value(6), QueryExpression.Value(2)
                                           ))
                ))
     {
         Assert.IsTrue(queryResult.HasRows);
         Assert.IsTrue(await queryResult.ReadAsync());
         Assert.AreEqual(3, queryResult.GetInt32(0));
     }
 }
            protected override Expression VisitBinary(BinaryExpression node)
            {
                var leftExpression  = ConvertToQueryExpression(node.Left);
                var rightExpression = ConvertToQueryExpression(node.Right);

                switch (node.NodeType)
                {
                case ExpressionType.AddChecked:
                case ExpressionType.Add:
                    SetConversionResult(
                        QueryExpression.Add(leftExpression, rightExpression)
                        );
                    break;

                case ExpressionType.SubtractChecked:
                case ExpressionType.Subtract:
                    SetConversionResult(
                        QueryExpression.Subtract(leftExpression, rightExpression)
                        );
                    break;

                case ExpressionType.MultiplyChecked:
                case ExpressionType.Multiply:
                    SetConversionResult(
                        QueryExpression.Multiply(leftExpression, rightExpression)
                        );
                    break;

                case ExpressionType.Divide:
                    SetConversionResult(
                        QueryExpression.Divide(leftExpression, rightExpression)
                        );
                    break;


                case ExpressionType.And:
                    SetConversionResult(
                        new BitwiseOperationQueryExpression(leftExpression, BitwiseOperator.And, rightExpression)
                        );
                    break;

                case ExpressionType.ExclusiveOr:
                    SetConversionResult(
                        new BitwiseOperationQueryExpression(leftExpression, BitwiseOperator.ExclusiveOr, rightExpression)
                        );
                    break;

                case ExpressionType.Or:
                    SetConversionResult(
                        new BitwiseOperationQueryExpression(leftExpression, BitwiseOperator.Or, rightExpression)
                        );
                    break;


                case ExpressionType.AndAlso:
                    SetConversionResult(
                        QueryExpression.AndAlso(leftExpression, rightExpression)
                        );
                    break;

                case ExpressionType.OrElse:
                    SetConversionResult(
                        QueryExpression.OrElse(leftExpression, rightExpression)
                        );
                    break;


                case ExpressionType.Equal:
                    SetConversionResult(
                        QueryExpression.Compare(leftExpression, ComparisonOperator.AreEqual, rightExpression)
                        );
                    break;

                case ExpressionType.NotEqual:
                    SetConversionResult(
                        QueryExpression.Compare(leftExpression, ComparisonOperator.AreNotEqual, rightExpression)
                        );
                    break;

                case ExpressionType.GreaterThan:
                    SetConversionResult(
                        QueryExpression.Compare(leftExpression, ComparisonOperator.GreaterThan, rightExpression)
                        );
                    break;

                case ExpressionType.GreaterThanOrEqual:
                    SetConversionResult(
                        QueryExpression.Compare(leftExpression, ComparisonOperator.GreaterThanOrEqualTo, rightExpression)
                        );
                    break;

                case ExpressionType.LessThan:
                    SetConversionResult(
                        QueryExpression.Compare(leftExpression, ComparisonOperator.LessThan, rightExpression)
                        );
                    break;

                case ExpressionType.LessThanOrEqual:
                    SetConversionResult(
                        QueryExpression.Compare(leftExpression, ComparisonOperator.LessThanOrEqualTo, rightExpression)
                        );
                    break;


                default:
                    throw new Exception($"Unsupported binary node type '{node.NodeType}'.");
                }

                return(node);
            }
        protected override Expression VisitBinary(BinaryExpression node)
        {
            var left = Visit(node.Left) as LinqQueryExpression <TEntity>;

            if (left == null)
            {
                throw new InvalidOperationException("Couldn't convert expression to SQL query expression.");
            }

            var right = Visit(node.Right) as LinqQueryExpression <TEntity>;

            if (right == null)
            {
                throw new InvalidOperationException("Couldn't convert expression to SQL query expression.");
            }

            var leftExpression  = left.QueryExpression;
            var rightExpression = right.QueryExpression;

            switch (node.NodeType)
            {
            case ExpressionType.AddChecked:
            case ExpressionType.Add:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.Add(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.SubtractChecked:
            case ExpressionType.Subtract:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.Subtract(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.MultiplyChecked:
            case ExpressionType.Multiply:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.Multiply(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.Divide:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.Divide(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.And:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.And(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.ExclusiveOr:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.ExclusiveOr(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.Or:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.Or(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.AndAlso:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.AndAlso(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.OrElse:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.OrElse(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.Equal:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.AreEqual(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.NotEqual:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.AreNotEqual(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.GreaterThan:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.GreaterThan(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.GreaterThanOrEqual:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.GreaterThanOrEqualTo(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.LessThan:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.LessThan(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            case ExpressionType.LessThanOrEqual:
                return(new LinqQueryExpression <TEntity>(
                           QueryExpression.LessThanOrEqualTo(leftExpression, rightExpression),
                           ConcatJoinBuilders(left.JoinBuilders, right.JoinBuilders)
                           ));

            default:
                throw new Exception($"Unsupported binary node type '{node.NodeType}'.");
            }
        }