Пример #1
0
        protected override ISqlBuilder Join(MemberExpression expression, ISqlBuilder sqlBuilder)
        {
            var tableAlias = GetTableAlias(expression, sqlBuilder);

            sqlBuilder.AppendJoinSql($"{tableAlias}{sqlBuilder.Formate(expression.Member.Name)} ");
            return(sqlBuilder);
        }
        protected override ISqlBuilder Join(ConstantExpression expression, ISqlBuilder sqlBuilder)
        {
            var sqlParamName = sqlBuilder.SetSqlParameter(expression.Value);

            sqlBuilder.AppendJoinSql($"{sqlParamName} ");
            return(sqlBuilder);
        }
Пример #3
0
        protected override ISqlBuilder Join(BinaryExpression expression, ISqlBuilder sqlBuilder)
        {
            var expressionLeft  = expression.Left;
            var expressionRight = expression.Right;

            if (expressionLeft is MemberExpression)
            {
                var memberExp = expressionLeft as MemberExpression;
                if (!MemberIsDataColumn(memberExp, sqlBuilder))
                {
                    throw new NotImplementedException($"{memberExp.Member.Name} is not data column");
                }
            }
            if (expressionRight is MemberExpression)
            {
                var memberExp = expressionRight as MemberExpression;
                if (!MemberIsDataColumn(memberExp, sqlBuilder))
                {
                    throw new NotImplementedException($"{memberExp.Member.Name} is not data column");
                }
            }

            var isRightHandle = false;

            if (IsNeedsParentheses(expression, expressionLeft))
            {
                sqlBuilder.AppendJoinSql("( ");
            }

            if (expressionLeft is MemberExpression && expressionLeft.Type == typeof(bool) && expressionLeft.NodeType == ExpressionType.MemberAccess && (expression.NodeType == ExpressionType.AndAlso || expressionRight is ConstantExpression))
            {
                SqlVistorProvider.Join(expressionLeft, sqlBuilder);

                sqlBuilder.AppendJoinSql($"{OperatorParser(ExpressionType.Equal)}");

                var sqlParamName = string.Empty;
                if (expressionRight is ConstantExpression)
                {
                    isRightHandle = true;
                    var value = Convert.ToBoolean(((ConstantExpression)expressionRight).Value) ? 1 : 0;
                    sqlParamName = sqlBuilder.SetSqlParameter(value);
                }
                else
                {
                    sqlParamName = sqlBuilder.SetSqlParameter(1);
                }

                sqlBuilder.AppendJoinSql($"{sqlParamName} ");
            }
            else
            {
                SqlVistorProvider.Join(expression.Left, sqlBuilder);
            }

            if (IsNeedsParentheses(expression, expressionLeft))
            {
                sqlBuilder.AppendJoinSql(") ");
            }

            if (!isRightHandle)
            {
                var whereOperator = string.Empty;
                if ((expressionRight is ConstantExpression) && ((ConstantExpression)expressionRight).Value == null)
                {
                    whereOperator = OperatorParser(expression.NodeType, true);
                }
                else
                {
                    whereOperator = OperatorParser(expression.NodeType);
                }
                sqlBuilder.AppendJoinSql($"{whereOperator}");

                if (IsNeedsParentheses(expression, expressionRight))
                {
                    sqlBuilder.AppendJoinSql("( ");
                }

                if (expressionRight is MemberExpression && expressionRight.Type == typeof(bool) && expressionRight.NodeType == ExpressionType.MemberAccess && expression.NodeType == ExpressionType.AndAlso)
                {
                    //(m=>m.IsAdmin)
                    SqlVistorProvider.Join(expressionRight, sqlBuilder);

                    sqlBuilder.AppendJoinSql($"{OperatorParser(ExpressionType.Equal)}");

                    var sqlParamName = sqlBuilder.SetSqlParameter(1);
                    sqlBuilder.AppendJoinSql($"{sqlParamName} ");
                }
                else if (expressionRight is MemberExpression && IsNodeTypeSetValue(expression.NodeType))
                {
                    var memberExp = expressionRight as MemberExpression;
                    var value     = TryGetExpreesionValue(memberExp);

                    if (value != null)
                    {
                        var sqlParamName = sqlBuilder.SetSqlParameter(value);
                        sqlBuilder.AppendWhereSql($"{sqlParamName} ");
                    }
                    else
                    {
                        SqlVistorProvider.Join(expression.Right, sqlBuilder);
                    }
                }
                else
                {
                    SqlVistorProvider.Join(expression.Right, sqlBuilder);
                }

                if (IsNeedsParentheses(expression, expressionRight))
                {
                    sqlBuilder.AppendWhereSql(") ");
                }
            }

            return(sqlBuilder);
        }