protected ClientJoinExpression UpdateClientJoin(ClientJoinExpression join, ProjectionExpression projection, IEnumerable<Expression> outerKey, IEnumerable<Expression> innerKey)
 {
     if (projection != join.Projection || outerKey != join.OuterKey || innerKey != join.InnerKey)
     {
         return new ClientJoinExpression(projection, outerKey, innerKey);
     }
     return join;
 }
 protected override Expression VisitClientJoin(ClientJoinExpression join)
 {
     var innerKey = this.VisitExpressionList(join.InnerKey);
     var outerKey = this.VisitExpressionList(join.OuterKey);
     ProjectionExpression projection = (ProjectionExpression)this.Visit(join.Projection);
     if (projection != join.Projection || innerKey != join.InnerKey || outerKey != join.OuterKey)
     {
         return new ClientJoinExpression(projection, outerKey, innerKey);
     }
     return join;
 }
 protected override Expression VisitClientJoin(ClientJoinExpression join)
 {
     // treat client joins as new top level
     var saveTop = this.isTopLevel;
     var saveSelect = this.currentSelect;
     this.isTopLevel = true;
     this.currentSelect = null;
     Expression result = base.VisitClientJoin(join);
     this.isTopLevel = saveTop;
     this.currentSelect = saveSelect;
     return result;
 }
 protected virtual Expression VisitClientJoin(ClientJoinExpression join)
 {
     var projection = (ProjectionExpression)this.Visit(join.Projection);
     var outerKey = this.VisitExpressionList(join.OuterKey);
     var innerKey = this.VisitExpressionList(join.InnerKey);
     return this.UpdateClientJoin(join, projection, outerKey, innerKey);
 }
 protected virtual Expression VisitClientJoin(ClientJoinExpression join)
 {
     this.AddAlias(join.Projection.Select.Alias);
     this.Write("ClientJoin(");
     this.WriteLine(Indentation.Inner);
     this.Write("OuterKey(");
     this.VisitExpressionList(join.OuterKey);
     this.Write("),");
     this.WriteLine(Indentation.Same);
     this.Write("InnerKey(");
     this.VisitExpressionList(join.InnerKey);
     this.Write("),");
     this.WriteLine(Indentation.Same);
     this.Visit(join.Projection);
     this.WriteLine(Indentation.Outer);
     this.Write(")");
     return join;
 }