Example #1
0
        protected override Expression VisitSubSelect(SubSelectExpression subSelectExpression)
        {
            var parentSearchCondition = _isSearchCondition;
            var subquery = (SelectExpression)Visit(subSelectExpression.Subquery);

            _isSearchCondition = parentSearchCondition;

            return(ApplyConversion(subSelectExpression.Update(subquery), condition: false));
        }
Example #2
0
        /// <summary>
        /// Main SQL builder
        /// </summary>
        /// <param name="selectExpression"></param>
        /// <param name="queryContext"></param>
        /// <returns></returns>
        public SqlStatement Build(SelectExpression selectExpression, QueryContext queryContext)
        {
            var translator  = GetTranslator(queryContext.DataContext.Vendor.SqlProvider);
            var sqlProvider = queryContext.DataContext.Vendor.SqlProvider;

            selectExpression = translator.OuterExpression(selectExpression);

            // A scope usually has:
            // - a SELECT: the operation creating a CLR object with data coming from SQL tier
            // - a FROM: list of tables
            // - a WHERE: list of conditions
            // - a GROUP BY: grouping by selected columns
            // - a ORDER BY: sort
            var select = BuildSelect(selectExpression, queryContext);

            if (select.ToString() == string.Empty)
            {
                SubSelectExpression subselect = null;
                if (selectExpression.Tables.Count == 1)
                {
                    subselect = selectExpression.Tables[0] as SubSelectExpression;
                }
                if (subselect != null)
                {
                    return(sqlProvider.GetParenthesis(Build(subselect.Select, queryContext)));
                }
            }

            // TODO: the following might be wrong (at least this might be the wrong place to do this
            if (select.ToString() == string.Empty)
            {
                select = new SqlStatement("SELECT " + sqlProvider.GetLiteral(null) + " AS " + sqlProvider.GetSafeName("Empty"));
            }

            var tables = GetSortedTables(selectExpression);
            var from   = BuildFrom(tables, queryContext);
            var join   = BuildJoin(tables, queryContext);

            var where = BuildWhere(tables, selectExpression.Where, queryContext);
            var groupBy = BuildGroupBy(selectExpression.Group, queryContext);
            var having  = BuildHaving(selectExpression.Where, queryContext);
            var orderBy = BuildOrderBy(selectExpression.OrderBy, queryContext);

            select = Join(queryContext, select, from, join, where, groupBy, having, orderBy);
            select = BuildLimit(selectExpression, select, queryContext);

            if (selectExpression.NextSelectExpression != null)
            {
                var nextLiteralSelect = Build(selectExpression.NextSelectExpression, queryContext);
                select = queryContext.DataContext.Vendor.SqlProvider.GetLiteral(
                    selectExpression.NextSelectExpressionOperator,
                    select, nextLiteralSelect);
            }

            return(select);
        }
Example #3
0
        protected override Expression VisitSubSelect(SubSelectExpression subSelectExpression)
        {
            _relationalCommandBuilder.Append("(");
            using (_relationalCommandBuilder.Indent())
            {
                Visit(subSelectExpression.Subquery);
            }
            _relationalCommandBuilder.Append(")");

            return(subSelectExpression);
        }
Example #4
0
        protected virtual SqlStatement BuildFrom(IList <TableExpression> tables, QueryContext queryContext)
        {
            var sqlProvider = queryContext.DataContext.Vendor.SqlProvider;
            var fromClauses = new List <SqlStatement>();

            foreach (var tableExpression in tables)
            {
                if (!MustDeclareAsJoin(tables, tableExpression))
                {
                    if (tableExpression.Alias != null)
                    {
                        string tableAlias;

                        // All subqueries has an alias in FROM
                        SubSelectExpression subquery = tableExpression as SubSelectExpression;
                        if (subquery == null)
                        {
                            tableAlias = sqlProvider.GetTableAsAlias(tableExpression.Name, tableExpression.Alias);
                        }
                        else
                        {
                            var subqueryStatements = new SqlStatement(Build(subquery.Select, queryContext));
                            tableAlias = sqlProvider.GetSubQueryAsAlias(subqueryStatements.ToString(), tableExpression.Alias);
                        }

                        if ((tableExpression.JoinType & TableJoinType.LeftOuter) != 0)
                        {
                            tableAlias = "/* LEFT OUTER */ " + tableAlias;
                        }
                        if ((tableExpression.JoinType & TableJoinType.RightOuter) != 0)
                        {
                            tableAlias = "/* RIGHT OUTER */ " + tableAlias;
                        }
                        fromClauses.Add(tableAlias);
                    }
                    else
                    {
                        fromClauses.Add(sqlProvider.GetTable(tableExpression.Name));
                    }
                }
            }
            return(sqlProvider.GetFromClause(fromClauses.ToArray()));
        }
Example #5
0
        protected virtual SqlStatement BuildFrom(IList <TableExpression> tables)
        {
            var sqlProvider = this._dbModel.LinqSqlProvider;
            var fromClauses = new List <SqlStatement>();

            foreach (var tableExpression in tables)
            {
                if (!MustDeclareAsJoin(tables, tableExpression))
                {
                    if (tableExpression.Alias != null)
                    {
                        string tableRef;

                        // All subqueries has an alias in FROM
                        SubSelectExpression subquery = tableExpression as SubSelectExpression;
                        if (subquery == null)
                        {
                            tableRef = _sqlProvider.GetTable(tableExpression);
                        }
                        else
                        {
                            var subqueryStatements = new SqlStatement(BuildSelectSql(subquery.Select));
                            tableRef = _sqlProvider.GetSubQueryAsAlias(subqueryStatements.ToString(), tableExpression.Alias);
                        }

                        if ((tableExpression.JoinType & TableJoinType.LeftOuter) != 0)
                        {
                            tableRef = "/* LEFT OUTER */ " + tableRef;
                        }
                        if ((tableExpression.JoinType & TableJoinType.RightOuter) != 0)
                        {
                            tableRef = "/* RIGHT OUTER */ " + tableRef;
                        }
                        fromClauses.Add(tableRef);
                    }
                    else
                    {
                        fromClauses.Add(_sqlProvider.GetTable(tableExpression));
                    }
                }
            }
            return(_sqlProvider.GetFromClause(fromClauses.ToArray()));
        }
Example #6
0
 protected abstract Expression VisitSubSelect(SubSelectExpression subSelectExpression);
Example #7
0
        protected override Expression VisitSubSelect(SubSelectExpression subSelectExpression)
        {
            var subquery = (SelectExpression)Visit(subSelectExpression.Subquery);

            return(subSelectExpression.Update(subquery));
        }