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)); }
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); }
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); }
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); }
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); }