Ejemplo n.º 1
0
        protected virtual Expression VisitClientJoin(DbClientJoinExpression join)
        {
            var projection = this.Visit(join.Projection) as DbProjectionExpression;
            var outerKey   = this.VisitExpressionList(join.OuterKey);
            var innerKey   = this.VisitExpressionList(join.InnerKey);

            return(this.UpdateClientJoin(join, projection, outerKey, innerKey));
        }
Ejemplo n.º 2
0
        protected DbClientJoinExpression UpdateClientJoin(DbClientJoinExpression join, DbProjectionExpression projection, IEnumerable <Expression> outerKey, IEnumerable <Expression> innerKey)
        {
            if (projection != join.Projection || outerKey != join.OuterKey || innerKey != join.InnerKey)
            {
                return(new DbClientJoinExpression(projection, outerKey, innerKey));
            }

            return(join);
        }
        protected override Expression VisitClientJoin(DbClientJoinExpression join)
        {
            var innerKey   = this.VisitExpressionList(join.InnerKey);
            var outerKey   = this.VisitExpressionList(join.OuterKey);
            var projection = this.Visit(join.Projection) as DbProjectionExpression;

            if (projection != join.Projection || innerKey != join.InnerKey || outerKey != join.OuterKey)
            {
                return(new DbClientJoinExpression(projection, outerKey, innerKey));
            }

            return(join);
        }
Ejemplo n.º 4
0
        protected override Expression VisitClientJoin(DbClientJoinExpression join)
        {
            var saveTop    = this.isTopLevel;
            var saveSelect = this.currentSelect;

            this.isTopLevel    = true;
            this.currentSelect = null;

            var result = base.VisitClientJoin(join);

            this.isTopLevel    = saveTop;
            this.currentSelect = saveSelect;

            return(result);
        }
Ejemplo n.º 5
0
        protected override Expression VisitClientJoin(DbClientJoinExpression join)
        {
            var innerKey = MakeJoinKey(join.InnerKey);
            var outerKey = MakeJoinKey(join.OuterKey);

            var kvpConstructor  = typeof(KeyValuePair <,>).MakeGenericType(innerKey.Type, join.Projection.Projector.Type).GetConstructor(new Type[] { innerKey.Type, join.Projection.Projector.Type });
            var constructKVPair = Expression.New(kvpConstructor, innerKey, join.Projection.Projector);
            var newProjection   = new DbProjectionExpression(join.Projection.Select, constructKVPair);

            var iLookup   = ++nLookup;
            var execution = this.ExecuteProjection(newProjection, okayToDefer: false, isTopLevel: false);

            var kvp = Expression.Parameter(constructKVPair.Type, "kvp");

            if (join.Projection.Projector.NodeType == (ExpressionType)DbExpressionType.OuterJoined)
            {
                var pred = Expression.Lambda
                           (
                    Expression.PropertyOrField(kvp, "Value").NotEqual(TypeHelper.GetNullConstant(join.Projection.Projector.Type)),
                    kvp
                           );

                execution = Expression.Call(typeof(Enumerable), nameof(Enumerable.Where), new Type[] { kvp.Type }, execution, pred);
            }

            var keySelector     = Expression.Lambda(Expression.PropertyOrField(kvp, "Key"), kvp);
            var elementSelector = Expression.Lambda(Expression.PropertyOrField(kvp, "Value"), kvp);
            var toLookup        = Expression.Call(typeof(Enumerable), nameof(Enumerable.ToLookup), new Type[] { kvp.Type, outerKey.Type, join.Projection.Projector.Type }, execution, keySelector, elementSelector);

            var lookup   = Expression.Parameter(toLookup.Type, "lookup" + iLookup);
            var property = lookup.Type.GetProperty("Item");
            var access   = Expression.Call(lookup, property.GetGetMethod(), this.Visit(outerKey)) as Expression;

            if (join.Projection.Aggregator != null)
            {
                access = DbExpressionReplacer.Replace(join.Projection.Aggregator.Body, join.Projection.Aggregator.Parameters[0], access);
            }

            this.variables.Add(lookup);
            this.initializers.Add(toLookup);

            return(access);
        }
Ejemplo n.º 6
0
        protected virtual Expression VisitClientJoin(DbClientJoinExpression join)
        {
            this.AddAlias(join.Projection.Select.Alias);
            this.Write("ClientJoin(");
            this.WriteLine(Indentation.Inner);
            this.Write("OuterKey(");
            this.VisitExpressionList(join.OuterKey);
            this.Write("),");
            this.WriteLine(Indentation.Same);
            this.Write("InnerKey(");
            this.VisitExpressionList(join.InnerKey);
            this.Write("),");
            this.WriteLine(Indentation.Same);
            this.Visit(join.Projection);
            this.WriteLine(Indentation.Outer);
            this.Write(")");

            return(join);
        }