protected virtual Expression VisitColumn(ColumnExpression column)
		{
			var exp = this.Visit(column.Declaration);
			if (exp != column.Declaration)
				return CompleteExpression.Column(exp, column.Name, column.Alias, column.Ordinal);
			return column;
		}
			protected override Expression VisitColumn(ColumnExpression column)
			{
				var columnName = column.Name;
				var index = 1;
				while (columns.Find(x => x.Name == columnName) != null)
					columnName = string.Format("{0}{1}", column.Name, ++index);

				column.Alias = alias;
				column.Ordinal = columns.Count;
				column.Name = columnName;

				column.MembershipPath = membershipPath;

				columns.Add(column);
				return column;
			}
		protected override Expression VisitColumn(ColumnExpression column)
		{
			return CompleteExpression.Column(column, column.Name, column.Alias);
		}
		protected virtual Expression VisitColumn(ColumnExpression exp)
		{
			this.Write(string.Format("[{2}].[{0}({1}) = ", exp.Name, exp.Ordinal, exp.Alias));
			this.Visit(exp.Declaration);
			this.Write("]");
			return exp;
		}
		protected override Expression VisitColumn(ColumnExpression column)
		{
			sb.AppendFormat("[{0}].[{1}]", column.Alias, column.Name);
			return column;
		}