protected virtual Expression VisitOuterJoined(OuterJoinedExpression outer) { var test = this.Visit(outer.Test); var expression = this.Visit(outer.Expression); return(this.UpdateOuterJoined(outer, test, expression)); }
public virtual ProjectionExpression AddOuterJoinTest(ProjectionExpression proj) { var test = this.GetOuterJoinTest(proj.Select); var select = proj.Select; ColumnExpression testCol = null; // look to see if test expression exists in columns already foreach (var col in select.Columns) { if (test.Equals(col.Expression)) { var colType = this.TypeSystem.GetColumnType(test.Type); testCol = new ColumnExpression(test.Type, colType, select.Alias, col.Name); break; } } if (testCol == null) { // add expression to projection testCol = test as ColumnExpression; string colName = (testCol != null) ? testCol.Name : "Test"; colName = proj.Select.Columns.GetAvailableColumnName(colName); var colType = this.TypeSystem.GetColumnType(test.Type); select = select.AddColumn(new ColumnDeclaration(colName, test, colType)); testCol = new ColumnExpression(test.Type, colType, select.Alias, colName); } var newProjector = new OuterJoinedExpression(testCol, proj.Projector); return(new ProjectionExpression(select, newProjector, proj.Aggregator)); }
protected OuterJoinedExpression UpdateOuterJoined(OuterJoinedExpression outer, Expression test, Expression expression) { if (test != outer.Test || expression != outer.Expression) { return(new OuterJoinedExpression(test, expression)); } return(outer); }
protected virtual Expression VisitOuterJoined(OuterJoinedExpression outer) { this.Write("Outer("); this.WriteLine(Indentation.Inner); this.Visit(outer.Test); this.Write(", "); this.WriteLine(Indentation.Same); this.Visit(outer.Expression); this.WriteLine(Indentation.Outer); this.Write(")"); return(outer); }
public static ProjectionExpression AddOuterJoinTest(this ProjectionExpression proj, QueryLanguage language, Expression expression) { string colName = proj.Select.Columns.GetAvailableColumnName("Test"); var colType = language.TypeSystem.GetColumnType(expression.Type); SelectExpression newSource = proj.Select.AddColumn(new ColumnDeclaration(colName, expression, colType)); Expression newProjector = new OuterJoinedExpression( new ColumnExpression(expression.Type, colType, newSource.Alias, colName), proj.Projector ); return(new ProjectionExpression(newSource, newProjector, proj.Aggregator)); }
protected override Expression VisitOuterJoined(OuterJoinedExpression outer) { Expression expr = this.Visit(outer.Expression); ColumnExpression column = (ColumnExpression)outer.Test; ParameterExpression reader; int iOrdinal; if (this.scope.TryGetValue(column, out reader, out iOrdinal)) { return(Expression.Condition( Expression.Call(reader, "IsDbNull", null, Expression.Constant(iOrdinal)), Expression.Constant(TypeHelper.GetDefault(outer.Type), outer.Type), expr )); } return(expr); }