public virtual SelectExpression PushDownSubquery() { _subqueryDepth++; var subquery = new SelectExpression(_sqlQueryGeneratorFactory, SystemAliasPrefix + _subqueryDepth); var columnAliasCounter = 0; foreach (var expression in _projection) { var aliasExpression = expression as AliasExpression; if (aliasExpression != null) { var columnExpression = aliasExpression.TryGetColumnExpression(); if (columnExpression != null && subquery._projection.OfType <AliasExpression>() .Any(ae => ae.TryGetColumnExpression()?.Name == columnExpression.Name)) { aliasExpression.Alias = "c" + columnAliasCounter++; } } else { aliasExpression = new AliasExpression("c" + columnAliasCounter++, expression); } subquery._projection.Add(aliasExpression); } subquery.AddTables(_tables); subquery.AddToOrderBy(_orderBy); subquery.Predicate = Predicate; subquery._limit = _limit; subquery._offset = _offset; subquery._isDistinct = _isDistinct; subquery._subqueryDepth = _subqueryDepth; subquery.IsProjectStar = IsProjectStar || !subquery._projection.Any(); _limit = null; _offset = null; _isDistinct = false; Predicate = null; ClearTables(); ClearProjection(); ClearOrderBy(); AddTable(subquery); return(subquery); }
public virtual SelectExpression PushDownSubquery() { _subqueryDepth++; var subquery = new SelectExpression(SystemAliasPrefix + _subqueryDepth); var columnAliasCounter = 0; // TODO: Only AliasExpressions? Don't unique-ify here. foreach (var aliasExpression in _projection.OfType <AliasExpression>()) { var columnExpression = aliasExpression.TryGetColumnExpression(); if (columnExpression != null && subquery._projection.OfType <AliasExpression>().Any(ae => ae.TryGetColumnExpression()?.Name == columnExpression.Name)) { aliasExpression.Alias = "c" + columnAliasCounter++; } subquery._projection.Add(aliasExpression); } subquery.AddTables(_tables); subquery.AddToOrderBy(_orderBy); subquery.Predicate = Predicate; subquery._limit = _limit; subquery._offset = _offset; subquery._isDistinct = _isDistinct; subquery._subqueryDepth = _subqueryDepth; subquery._projectStar = _projectStar || !subquery._projection.Any(); _limit = null; _offset = null; _isDistinct = false; Predicate = null; ClearTables(); ClearProjection(); ClearOrderBy(); _projectStar = true; AddTable(subquery); return(subquery); }
public virtual SelectExpression Clone([NotNull] string alias) { Check.NotEmpty(alias, nameof(alias)); var selectExpression = new SelectExpression(_sqlQueryGeneratorFactory, alias) { _limit = _limit, _offset = _offset, _isDistinct = _isDistinct, _subqueryDepth = _subqueryDepth, IsProjectStar = IsProjectStar, Predicate = Predicate }; selectExpression._projection.AddRange(_projection); selectExpression.AddTables(_tables); selectExpression.AddToOrderBy(_orderBy); return selectExpression; }
public virtual SelectExpression Clone([NotNull] string alias) { Check.NotEmpty(alias, nameof(alias)); var selectExpression = new SelectExpression(_sqlQueryGeneratorFactory, alias) { _limit = _limit, _offset = _offset, _isDistinct = _isDistinct, _subqueryDepth = _subqueryDepth, IsProjectStar = IsProjectStar, Predicate = Predicate }; selectExpression._projection.AddRange(_projection); selectExpression.AddTables(_tables); selectExpression.AddToOrderBy(_orderBy); return(selectExpression); }
public virtual SelectExpression PushDownSubquery() { _subqueryDepth++; var subquery = new SelectExpression(_sqlQueryGeneratorFactory, SystemAliasPrefix + _subqueryDepth); var columnAliasCounter = 0; foreach (var expression in _projection) { var aliasExpression = expression as AliasExpression; if (aliasExpression != null) { var columnExpression = aliasExpression.TryGetColumnExpression(); if (columnExpression != null && subquery._projection.OfType<AliasExpression>() .Any(ae => ae.TryGetColumnExpression()?.Name == columnExpression.Name)) { aliasExpression.Alias = "c" + columnAliasCounter++; } } else { aliasExpression = new AliasExpression("c" + columnAliasCounter++, expression); } subquery._projection.Add(aliasExpression); } subquery.AddTables(_tables); subquery.AddToOrderBy(_orderBy); subquery.Predicate = Predicate; subquery._limit = _limit; subquery._offset = _offset; subquery._isDistinct = _isDistinct; subquery._subqueryDepth = _subqueryDepth; subquery.IsProjectStar = IsProjectStar || !subquery._projection.Any(); _limit = null; _offset = null; _isDistinct = false; Predicate = null; ClearTables(); ClearProjection(); ClearOrderBy(); AddTable(subquery); return subquery; }
public virtual SelectExpression PushDownSubquery() { _subqueryDepth++; var subquery = new SelectExpression(SystemAliasPrefix + _subqueryDepth); var columnAliasCounter = 0; // TODO: Only AliasExpressions? Don't unique-ify here. foreach (var aliasExpression in _projection.OfType<AliasExpression>()) { var columnExpression = aliasExpression.TryGetColumnExpression(); if (columnExpression != null && subquery._projection.OfType<AliasExpression>().Any(ae => ae.TryGetColumnExpression()?.Name == columnExpression.Name)) { aliasExpression.Alias = "c" + columnAliasCounter++; } subquery._projection.Add(aliasExpression); } subquery.AddTables(_tables); subquery.AddToOrderBy(_orderBy); subquery.Predicate = Predicate; subquery._limit = _limit; subquery._offset = _offset; subquery._isDistinct = _isDistinct; subquery._subqueryDepth = _subqueryDepth; subquery._projectStar = _projectStar || !subquery._projection.Any(); _limit = null; _offset = null; _isDistinct = false; Predicate = null; ClearTables(); ClearProjection(); ClearOrderBy(); _projectStar = true; AddTable(subquery); return subquery; }
private static void LiftOrderBy( SelectExpression innerJoinSelectExpression, SelectExpression targetSelectExpression, TableExpressionBase innerJoinExpression) { foreach (var ordering in innerJoinSelectExpression.OrderBy) { var orderingExpression = ordering.Expression; var aliasExpression = ordering.Expression as AliasExpression; if (aliasExpression?.Alias != null) { var columnExpression = aliasExpression.TryGetColumnExpression(); if (columnExpression != null) { orderingExpression = new ColumnExpression( aliasExpression.Alias, columnExpression.Property, columnExpression.Table); } } var index = innerJoinSelectExpression.AddToProjection(orderingExpression); var expression = innerJoinSelectExpression.Projection[index]; var newExpression = targetSelectExpression.UpdateColumnExpression(expression, innerJoinExpression); targetSelectExpression.AddToOrderBy(new Ordering(newExpression, ordering.OrderingDirection)); } innerJoinSelectExpression.ClearOrderBy(); }