private void ConvertSpanPath(
            ObjectFullSpanRewriter.SpanPathInfo parentInfo,
            List <string> navPropNames,
            int pos)
        {
            NavigationProperty index = (NavigationProperty)null;

            if (!parentInfo.DeclaringType.NavigationProperties.TryGetValue(navPropNames[pos], true, out index))
            {
                throw new InvalidOperationException(Strings.ObjectQuery_Span_NoNavProp((object)parentInfo.DeclaringType.FullName, (object)navPropNames[pos]));
            }
            if (parentInfo.Children == null)
            {
                parentInfo.Children = new Dictionary <NavigationProperty, ObjectFullSpanRewriter.SpanPathInfo>();
            }
            ObjectFullSpanRewriter.SpanPathInfo parentInfo1 = (ObjectFullSpanRewriter.SpanPathInfo)null;
            if (!parentInfo.Children.TryGetValue(index, out parentInfo1))
            {
                parentInfo1 = new ObjectFullSpanRewriter.SpanPathInfo(ObjectFullSpanRewriter.EntityTypeFromResultType(index));
                parentInfo.Children[index] = parentInfo1;
            }
            if (pos >= navPropNames.Count - 1)
            {
                return;
            }
            this.ConvertSpanPath(parentInfo1, navPropNames, pos + 1);
        }
        private static EntityType EntityTypeFromResultType(NavigationProperty navProp)
        {
            EntityType entityType = (EntityType)null;

            ObjectFullSpanRewriter.TryGetEntityType(navProp.TypeUsage, out entityType);
            return(entityType);
        }
        internal ObjectFullSpanRewriter(
            DbCommandTree tree,
            DbExpression toRewrite,
            Span span,
            AliasGenerator aliasGenerator)
            : base(tree, toRewrite, aliasGenerator)
        {
            EntityType entityType = (EntityType)null;

            if (!ObjectFullSpanRewriter.TryGetEntityType(this.Query.ResultType, out entityType))
            {
                throw new InvalidOperationException(Strings.ObjectQuery_Span_IncludeRequiresEntityOrEntityCollection);
            }
            ObjectFullSpanRewriter.SpanPathInfo parentInfo = new ObjectFullSpanRewriter.SpanPathInfo(entityType);
            foreach (Span.SpanPath span1 in span.SpanList)
            {
                this.AddSpanPath(parentInfo, span1.Navigations);
            }
            this._currentSpanPath.Push(parentInfo);
        }
        internal static bool TryRewrite(
            DbQueryCommandTree tree, Span span, MergeOption mergeOption, AliasGenerator aliasGenerator, out DbExpression newQuery,
            out SpanIndex spanInfo)
        {
            newQuery = null;
            spanInfo = null;

            ObjectSpanRewriter rewriter  = null;
            var requiresRelationshipSpan = Span.RequiresRelationshipSpan(mergeOption);

            // Potentially perform a rewrite for span.
            // Note that the public 'Span' property is NOT used to retrieve the Span instance
            // since this forces creation of a Span object that may not be required.
            if (span != null &&
                span.SpanList.Count > 0)
            {
                rewriter = new ObjectFullSpanRewriter(tree, tree.Query, span, aliasGenerator);
            }
            else if (requiresRelationshipSpan)
            {
                rewriter = new ObjectSpanRewriter(tree, tree.Query, aliasGenerator);
            }

            if (rewriter != null)
            {
                rewriter.RelationshipSpan = requiresRelationshipSpan;
                newQuery = rewriter.RewriteQuery();
                if (newQuery != null)
                {
                    Debug.Assert(
                        rewriter.SpanIndex != null || tree.Query.ResultType.EdmEquals(newQuery.ResultType),
                        "Query was rewritten for Span but no SpanIndex was created?");
                    spanInfo = rewriter.SpanIndex;
                }
            }

            return(spanInfo != null);
        }
        internal static bool TryRewrite(
            DbQueryCommandTree tree, Span span, MergeOption mergeOption, AliasGenerator aliasGenerator, out DbExpression newQuery,
            out SpanIndex spanInfo)
        {
            newQuery = null;
            spanInfo = null;

            ObjectSpanRewriter rewriter = null;
            var requiresRelationshipSpan = Span.RequiresRelationshipSpan(mergeOption);

            // Potentially perform a rewrite for span.
            // Note that the public 'Span' property is NOT used to retrieve the Span instance
            // since this forces creation of a Span object that may not be required.
            if (span != null
                && span.SpanList.Count > 0)
            {
                rewriter = new ObjectFullSpanRewriter(tree, tree.Query, span, aliasGenerator);
            }
            else if (requiresRelationshipSpan)
            {
                rewriter = new ObjectSpanRewriter(tree, tree.Query, aliasGenerator);
            }

            if (rewriter != null)
            {
                rewriter.RelationshipSpan = requiresRelationshipSpan;
                newQuery = rewriter.RewriteQuery();
                if (newQuery != null)
                {
                    Debug.Assert(
                        rewriter.SpanIndex != null || tree.Query.ResultType.EdmEquals(newQuery.ResultType),
                        "Query was rewritten for Span but no SpanIndex was created?");
                    spanInfo = rewriter.SpanIndex;
                }
            }

            return (spanInfo != null);
        }