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);
     }
 }