public override SqlExpressions.IAliasedExpression Visit(SqlExpressions.SelectStatement item) { SqlExpressions.SelectStatement oldItem = item; var columnToReplaceWith = this.columnToReplaceWith; if (this.columnToReplaceWith != null && inFrom && item.Top == 0) { replacedSelect = item = (SqlExpressions.SelectStatement)updater.Update(item, new SqlExpressions.IAliasedExpression[] { columnToReplaceWith }, item.From, item.Where, item.OrderBy, item.Alias); } this.columnToReplaceWith = null; int n = 0; foreach (var column in oldItem.Columns) { n++; this.columnToReplaceWith = column; } if (n > 1 || this.columnToReplaceWith == null || this.columnToReplaceWith.DbExpressionType != SqlExpressions.DbExpressionType.Aggregate) { if (this.columnToReplaceWith != null) { if (this.columnToReplaceWith.DbExpressionType == SqlExpressions.DbExpressionType.Column) { var column = this.columnToReplaceWith as SqlExpressions.ComplexColumnExpression; if (column != null && ((SqlExpressions.IDbExpression)column.Expression).DbExpressionType != SqlExpressions.DbExpressionType.Value) { this.columnToReplaceWith = null; replacedSelect = null; item = oldItem; } else if (this.columnToReplaceWith.DbExpressionType != SqlExpressions.DbExpressionType.Aggregate) { this.columnToReplaceWith = null; replacedSelect = null; item = oldItem; } } else { this.columnToReplaceWith = null; replacedSelect = null; item = oldItem; } } } var result = base.Visit(item); this.columnToReplaceWith = columnToReplaceWith; if (replacedSelect != null && item != replacedSelect) { result = replacedSelect; replacedSelect = null; } return result; }
public override SqlExpressions.IAliasedExpression Visit(SqlExpressions.SelectStatement item) { bool wasInSelect = inSelect; if (!inSelect) { int n = 0; foreach (var column in item.Columns) { n++; lastColumn = column; } if (n == 1 && (lastColumn.DbExpressionType == SqlExpressions.DbExpressionType.Aggregate || lastColumn.DbExpressionType == DbExpressionType.Function || lastColumn.DbExpressionType == DbExpressionType.Column && ((ColumnExpression)lastColumn).Alias == null)) { inSelect = true; if (item.Where != null || item.From.Count != 1 || item.From[0].DbExpressionType != DbExpressionType.Select || ((SelectStatement)item.From[0]).Top > 0) lastColumn = null; item = (SqlExpressions.SelectStatement)base.Visit(item); if (lastColumn != null) return item.From[0]; inSelect = wasInSelect; } return item; } else { List<SqlExpressions.IAliasedExpression> columns = new List<SqlExpressions.IAliasedExpression>(); foreach (var column in item.Columns) { if (column.DbExpressionType == SqlExpressions.DbExpressionType.Column && column is SqlExpressions.ComplexColumnExpression) columns.Add(column); } if (columns.Count <= 1) { if (columns.Count == 1 && (((SqlExpressions.IDbExpression)((SqlExpressions.ComplexColumnExpression)columns[0]).Expression).DbExpressionType == SqlExpressions.DbExpressionType.Case || ((SqlExpressions.IDbExpression)((SqlExpressions.ComplexColumnExpression)columns[0]).Expression).DbExpressionType == SqlExpressions.DbExpressionType.Value)) { columns.RemoveAt(0); } if (lastColumn != null) columns.Add(lastColumn); else columns.Add(new ComplexColumnExpression(null, new Constant(1, System.Data.DbType.Int32), "a")); } return updater.Update(item, columns, item.From, item.Where, item.OrderBy, item.Alias); } }