private DbExpression RewriteCollection(DbExpression expression) { DbExpression dbExpression = expression; DbProjectExpression projectExpression = (DbProjectExpression)null; if (DbExpressionKind.Project == expression.ExpressionKind) { projectExpression = (DbProjectExpression)expression; dbExpression = projectExpression.Input.Expression; } ObjectSpanRewriter.NavigationInfo navInfo = (ObjectSpanRewriter.NavigationInfo)null; if (this.RelationshipSpan) { dbExpression = ObjectSpanRewriter.RelationshipNavigationVisitor.FindNavigationExpression(dbExpression, this._aliasGenerator, out navInfo); } if (navInfo != null) { this.EnterNavigationCollection(navInfo); } else { this.EnterCollection(); } DbExpression body = expression; if (projectExpression != null) { DbExpression projection = this.Rewrite(projectExpression.Projection); if (!object.ReferenceEquals((object)projectExpression.Projection, (object)projection)) { body = (DbExpression)dbExpression.BindAs(projectExpression.Input.VariableName).Project(projection); } } else { DbExpressionBinding input = dbExpression.BindAs(this._aliasGenerator.Next()); DbExpression variable = (DbExpression)input.Variable; DbExpression projection = this.Rewrite(variable); if (!object.ReferenceEquals((object)variable, (object)projection)) { body = (DbExpression)input.Project(projection); } } this.ExitCollection(); if (navInfo != null && navInfo.InUse) { body = (DbExpression)DbExpressionBuilder.Lambda(body, (IEnumerable <DbVariableReferenceExpression>) new List <DbVariableReferenceExpression>(1) { navInfo.SourceVariable }).Invoke((IEnumerable <DbExpression>) new List <DbExpression>(1) { navInfo.Source }); } return(body); }
internal static DbExpression FindNavigationExpression( DbExpression expression, AliasGenerator aliasGenerator, out ObjectSpanRewriter.NavigationInfo navInfo) { navInfo = (ObjectSpanRewriter.NavigationInfo)null; TypeUsage typeUsage = ((CollectionType)expression.ResultType.EdmType).TypeUsage; if (!TypeSemantics.IsEntityType(typeUsage) && !TypeSemantics.IsReferenceType(typeUsage)) { return(expression); } ObjectSpanRewriter.RelationshipNavigationVisitor navigationVisitor = new ObjectSpanRewriter.RelationshipNavigationVisitor(aliasGenerator); DbExpression dbExpression = navigationVisitor.Find(expression); if (object.ReferenceEquals((object)expression, (object)dbExpression)) { return(expression); } navInfo = new ObjectSpanRewriter.NavigationInfo(navigationVisitor._original, navigationVisitor._rewritten); return(dbExpression); }
private bool TryGetNavigationSource( AssociationEndMember wasSourceNowTargetEnd, out DbExpression source) { source = (DbExpression)null; ObjectSpanRewriter.NavigationInfo navigationInfo = (ObjectSpanRewriter.NavigationInfo)null; if (this._navSources.Count > 0) { navigationInfo = this._navSources.Peek(); if (navigationInfo != null && !object.ReferenceEquals((object)wasSourceNowTargetEnd, (object)navigationInfo.SourceEnd)) { navigationInfo = (ObjectSpanRewriter.NavigationInfo)null; } } if (navigationInfo == null) { return(false); } source = (DbExpression)navigationInfo.SourceVariable; navigationInfo.InUse = true; return(true); }
private void EnterNavigationCollection(ObjectSpanRewriter.NavigationInfo info) { this._navSources.Push(info); }