public virtual Expression VisitOuterJoinExpression(LeftOuterJoinExpression leftOuterJoinExpression) { Check.NotNull(leftOuterJoinExpression, "leftOuterJoinExpression"); _sql.Append("LEFT JOIN "); VisitExpression(leftOuterJoinExpression.TableExpression); _sql.Append(" ON "); VisitExpression(leftOuterJoinExpression.Predicate); return(leftOuterJoinExpression); }
public virtual Expression VisitLeftOuterJoin(LeftOuterJoinExpression leftOuterJoinExpression) { Check.NotNull(leftOuterJoinExpression, nameof(leftOuterJoinExpression)); _relationalCommandBuilder.Append("LEFT JOIN "); Visit(leftOuterJoinExpression.TableExpression); _relationalCommandBuilder.Append(" ON "); Visit(leftOuterJoinExpression.Predicate); return(leftOuterJoinExpression); }
private static Expression HandleDefaultIfEmpty(HandlerContext handlerContext) { var defaultIfEmptyResultOperator = (DefaultIfEmptyResultOperator)handlerContext.ResultOperator; if (defaultIfEmptyResultOperator.OptionalDefaultValue != null) { return(handlerContext.EvalOnClient()); } var selectExpression = handlerContext.SelectExpression; selectExpression.PushDownSubquery(); selectExpression.ExplodeStarProjection(); var subquery = selectExpression.Tables.Single(); selectExpression.ClearTables(); var emptySelectExpression = handlerContext.SelectExpressionFactory.Create(handlerContext.QueryModelVisitor.QueryCompilationContext, "empty"); emptySelectExpression.AddToProjection(new AliasExpression("empty", Expression.Constant(null))); selectExpression.AddTable(emptySelectExpression); var leftOuterJoinExpression = new LeftOuterJoinExpression(subquery); var constant1 = Expression.Constant(1); leftOuterJoinExpression.Predicate = Expression.Equal(constant1, constant1); selectExpression.AddTable(leftOuterJoinExpression); selectExpression.ProjectStarTable = subquery; handlerContext.QueryModelVisitor.Expression = new DefaultIfEmptyExpressionVisitor( handlerContext.QueryModelVisitor.QueryCompilationContext) .Visit(handlerContext.QueryModelVisitor.Expression); return(handlerContext.EvalOnClient(requiresClientResultOperator: false)); }