protected override Expression VisitSubSelect(SubSelectExpression subSelectExpression) { var parentSearchCondition = _isSearchCondition; var subquery = (SelectExpression)Visit(subSelectExpression.Subquery); _isSearchCondition = parentSearchCondition; return(ApplyConversion(subSelectExpression.Update(subquery), condition: false)); }
/// <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); }
protected override Expression VisitSubSelect(SubSelectExpression subSelectExpression) { _relationalCommandBuilder.Append("("); using (_relationalCommandBuilder.Indent()) { Visit(subSelectExpression.Subquery); } _relationalCommandBuilder.Append(")"); return(subSelectExpression); }
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())); }
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())); }
protected abstract Expression VisitSubSelect(SubSelectExpression subSelectExpression);
protected override Expression VisitSubSelect(SubSelectExpression subSelectExpression) { var subquery = (SelectExpression)Visit(subSelectExpression.Subquery); return(subSelectExpression.Update(subquery)); }