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