示例#1
0
        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
                       ));
        }
示例#2
0
        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));
        }
示例#3
0
        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));
        }