protected virtual Expression BindJoin(Type resultType, Expression outerSource, Expression innerSource, LambdaExpression outerKey, LambdaExpression innerKey, LambdaExpression resultSelector) { ProjectionExpression outerProjection = (ProjectionExpression)this.Visit(outerSource); ProjectionExpression innerProjection = (ProjectionExpression)this.Visit(innerSource); this.map[outerKey.Parameters[0]] = outerProjection.Projector; Expression outerKeyExpr = this.Visit(outerKey.Body); this.map[innerKey.Parameters[0]] = innerProjection.Projector; Expression innerKeyExpr = this.Visit(innerKey.Body); this.map[resultSelector.Parameters[0]] = outerProjection.Projector; this.map[resultSelector.Parameters[1]] = innerProjection.Projector; Expression resultExpr = this.Visit(resultSelector.Body); JoinExpression join = new JoinExpression(resultType, JoinType.InnerJoin, outerProjection.Source, innerProjection.Source, Expression.Equal(outerKeyExpr, innerKeyExpr)); string alias = this.GetNextAlias(); ProjectedColumns pc = this.ProjectColumns(resultExpr, alias, outerProjection.Source.Alias, innerProjection.Source.Alias); return(new ProjectionExpression( new SelectExpression(resultType, alias, pc.Columns, join, null, null), pc.Projector )); }
protected virtual Expression BindOrderBy(Type resultType, Expression source, LambdaExpression orderSelector, OrderType orderType) { List <OrderExpression> myThenBys = this.thenBys; this.thenBys = null; ProjectionExpression projection = (ProjectionExpression)this.Visit(source); this.map[orderSelector.Parameters[0]] = projection.Projector; List <OrderExpression> orderings = new List <OrderExpression>(); orderings.Add(new OrderExpression(orderType, this.Visit(orderSelector.Body))); if (myThenBys != null) { for (int i = myThenBys.Count - 1; i >= 0; i--) { OrderExpression tb = myThenBys[i]; LambdaExpression lambda = (LambdaExpression)tb.Expression; this.map[lambda.Parameters[0]] = projection.Projector; orderings.Add(new OrderExpression(tb.OrderType, this.Visit(lambda.Body))); } } var test = orderings.AsReadOnly(); string alias = this.GetNextAlias(); ProjectedColumns pc = this.ProjectColumns(projection.Projector, alias, projection.Source.Alias); return(new ProjectionExpression( new SelectExpression(resultType, alias, pc.Columns, projection.Source, null, orderings.AsReadOnly()), pc.Projector)); }
private Expression BindSelect(Type resultType, Expression source, LambdaExpression selector) { ProjectionExpression projection = (ProjectionExpression)this.Visit(source); this.map[selector.Parameters[0]] = projection.Projector; Expression expression = this.Visit(selector.Body); string alias = this.GetNextAlias(); ProjectedColumns pc = this.ProjectColumns(expression, alias, GetExistingAlias(projection.Source)); return(new ProjectionExpression( new SelectExpression(resultType, alias, pc.Columns, projection.Source, null, null), pc.Projector)); }