/// <summary>
        /// Join
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql打包对象</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Join(BinaryExpression expression, SqlWrapper sqlWrapper)
        {
            //左侧嵌套
            var leftBinary            = expression.Left as BinaryExpression;
            var isBinaryLeft          = leftBinary?.Left is BinaryExpression;
            var isBoolMethodCallLeft  = (leftBinary?.Left as MethodCallExpression)?.Method.ReturnType == typeof(bool);
            var isBinaryRight         = leftBinary?.Right is BinaryExpression;
            var isBoolMethodCallRight = (leftBinary?.Right as MethodCallExpression)?.Method.ReturnType == typeof(bool);
            var leftNested            = (isBinaryLeft || isBoolMethodCallLeft) && (isBinaryRight || isBoolMethodCallRight);

            if (leftNested)
            {
                sqlWrapper += "(";
            }

            SqlExpressionProvider.Join(expression.Left, sqlWrapper);

            if (leftNested)
            {
                sqlWrapper += ")";
            }

            var operatorIndex = sqlWrapper.Length;

            //右侧嵌套
            var rightBinary = expression.Right as BinaryExpression;

            isBinaryLeft          = rightBinary?.Left is BinaryExpression;
            isBoolMethodCallLeft  = (rightBinary?.Left as MethodCallExpression)?.Method.ReturnType == typeof(bool);
            isBinaryRight         = rightBinary?.Right is BinaryExpression;
            isBoolMethodCallRight = (rightBinary?.Right as MethodCallExpression)?.Method.ReturnType == typeof(bool);
            var rightNested = (isBinaryLeft || isBoolMethodCallLeft) && (isBinaryRight || isBoolMethodCallRight);

            if (rightNested)
            {
                sqlWrapper += "(";
            }

            SqlExpressionProvider.Where(expression.Right, sqlWrapper);

            if (rightNested)
            {
                sqlWrapper += ")";
            }

            //表达式左侧为bool类型常量且为true时,不进行sql拼接
            if (!(expression.Left.NodeType == ExpressionType.Constant && expression.Left.ToObject() is bool b && b))
            {
                var sqlLength = sqlWrapper.Length;
                OperatorResolver(
                    expression.NodeType,
                    operatorIndex,
                    sqlWrapper,
                    sqlLength - operatorIndex == 5 &&
                    sqlWrapper.EndsWith("NULL"));
            }

            return(sqlWrapper);
        }
Пример #2
0
        /// <summary>
        /// Having
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Having(ConstantExpression expression, SqlWrapper sqlWrapper)
        {
            //表达式左侧为bool类型常量
            if (expression.NodeType == ExpressionType.Constant && expression.Value is bool res)
            {
                if (!res && sqlWrapper.EndsWith("AND", "OR"))
                {
                    sqlWrapper += " 1 = 0 ";
                }
            }
            else
            {
                sqlWrapper.AddDbParameter(expression.Value);
            }

            return(sqlWrapper);
        }
Пример #3
0
        /// <summary>
        /// Equals
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql打包对象</param>
        private static void Equals(MethodCallExpression expression, SqlWrapper sqlWrapper)
        {
            if (expression.Object != null)
            {
                SqlExpressionProvider.Where(expression.Object, sqlWrapper);
            }

            var signIndex = sqlWrapper.Length;

            SqlExpressionProvider.Where(expression.Arguments[0], sqlWrapper);

            if (sqlWrapper.EndsWith("NULL"))
            {
                sqlWrapper.Insert(signIndex, " IS ");
            }
            else
            {
                sqlWrapper.Insert(signIndex, " = ");
            }
        }
Пример #4
0
        /// <summary>
        /// Where
        /// </summary>
        /// <param name="expression">表达式树</param>
        /// <param name="sqlWrapper">sql包装器</param>
        /// <returns>SqlWrapper</returns>
        public override SqlWrapper Where(ConditionalExpression expression, SqlWrapper sqlWrapper)
        {
            var isNot          = false;
            var testExpression = expression.Test;

            //UnaryExpression
            if (testExpression is UnaryExpression unaryExpression)
            {
                isNot          = unaryExpression.NodeType == ExpressionType.Not;
                testExpression = unaryExpression.Operand;
            }

            //MethodCallExpression
            if (testExpression is MethodCallExpression methodCallExpression)
            {
                var test = methodCallExpression.ToObject <bool>(out var res);
                if (res)
                {
                    if (isNot ? !test : test)
                    {
                        SqlExpressionProvider.Where(expression.IfTrue, sqlWrapper);
                    }
                    else
                    {
                        SqlExpressionProvider.Where(expression.IfFalse, sqlWrapper);
                    }
                }
            }

            //BinaryExpression
            if (testExpression is BinaryExpression binaryExpression)
            {
                var test = binaryExpression.ToObject <bool>(out var res);
                if (!res)
                {
                    test = binaryExpression.Left.ToObject <bool>(out var left);
                    if (!left)
                    {
                        SqlExpressionProvider.Where(binaryExpression.Left, sqlWrapper);
                        BinaryExpressionResolver.OperatorResolver(
                            binaryExpression.NodeType,
                            sqlWrapper.Length,
                            sqlWrapper,
                            sqlWrapper.EndsWith("NULL"));
                    }

                    var right = false;
                    if (!left)
                    {
                        test = binaryExpression.Right.ToObject <bool>(out right);
                    }

                    if (left || !right)
                    {
                        SqlExpressionProvider.Where(binaryExpression.Right, sqlWrapper);
                        BinaryExpressionResolver.OperatorResolver(
                            binaryExpression.NodeType,
                            sqlWrapper.Length,
                            sqlWrapper,
                            sqlWrapper.EndsWith("NULL"));
                    }
                }

                if (isNot ? !test : test)
                {
                    SqlExpressionProvider.Where(expression.IfTrue, sqlWrapper);
                }
                else
                {
                    SqlExpressionProvider.Where(expression.IfFalse, sqlWrapper);
                }
            }

            return(sqlWrapper);
        }