public override DbExpression Visit(DbJoinExpression expression) { Check.NotNull(expression, "expression"); DbExpression result = expression; var newLeft = VisitExpressionBinding(expression.Left); var newRight = VisitExpressionBinding(expression.Right); EnterScope(newLeft.Variable, newRight.Variable); var newCondition = VisitExpression(expression.JoinCondition); ExitScope(); if (!ReferenceEquals(expression.Left, newLeft) || !ReferenceEquals(expression.Right, newRight) || !ReferenceEquals(expression.JoinCondition, newCondition)) { if (DbExpressionKind.InnerJoin == expression.ExpressionKind) { result = CqtBuilder.InnerJoin(newLeft, newRight, newCondition); } else if (DbExpressionKind.LeftOuterJoin == expression.ExpressionKind) { result = CqtBuilder.LeftOuterJoin(newLeft, newRight, newCondition); } else { Debug.Assert( expression.ExpressionKind == DbExpressionKind.FullOuterJoin, "DbJoinExpression had ExpressionKind other than InnerJoin, LeftOuterJoin or FullOuterJoin?"); result = CqtBuilder.FullOuterJoin(newLeft, newRight, newCondition); } } NotifyIfChanged(expression, result); return(result); }