protected virtual Expression VisitJoin(JoinExpression join)
		{
			var left = this.Visit(join.Left) as SourceExpression;
			var right = this.Visit(join.Right) as SourceExpression;
			var comparison = join.Comparison != null ? this.Visit(join.Comparison) : null;

			if (left == join.Left &&
				right == join.Right &&
				comparison == join.Comparison)
				return join;

			return CompleteExpression.Join(left, right, join.JoinType, comparison);
		}
		protected virtual Expression VisitJoin(JoinExpression join)
		{
			this.Write("." + join.JoinType + "(");
			this.WriteLine(Indentation.Inner);
			this.Visit(join.Left);
			this.Write(",");
			this.WriteLine(Indentation.Same);
			this.Visit(join.Right);

			if (join.Comparison != null)
			{
				this.Write(",");
				this.WriteLine(Indentation.Same);
				this.Visit(join.Comparison);
			}

			this.WriteLine(Indentation.Outer);
			this.Write(")");
			return join;
		}
		protected override Expression VisitJoin(JoinExpression join)
		{
			VisitSource(join.Left);
			VisitJoinType(join.JoinType);
			VisitSource(join.Right);

			if (join.Comparison != null)
			{
				this.AppendNewLine(Indentation.Inner);
				sb.Append(" on ");
				this.Visit(join.Comparison);
				this.Indent(Indentation.Outer);
			}
			this.Indent(Indentation.Outer);
			return join;
		}