Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataWeb / Client / System / Data / Services / Client / DataServiceQueryContinuation.cs / 1305376 / DataServiceQueryContinuation.cs

    //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
//  
// Provides a class to represent the continuation of a query.
//  
//--------------------------------------------------------------------- 

namespace System.Data.Services.Client 
{
    #region Namespaces.

    using System.Collections.Generic; 
    using System.Diagnostics;
    using System.Linq.Expressions; 
    using System.Text; 
    using System.Reflection;
 
    #endregion Namespaces.

    /// Use this class to represent the continuation of a query.
    [DebuggerDisplay("{NextLinkUri}")] 
    public abstract class DataServiceQueryContinuation
    { 
        #region Private fields. 

        /// URI to next page of data. 
        private readonly Uri nextLinkUri;

        /// Projection plan for results of next page.
        private readonly ProjectionPlan plan; 

        #endregion Private fields. 
 
        #region Constructors.
 
        /// Initializes a new  instance.
        /// URI to next page of data.
        /// Projection plan for results of next page.
        internal DataServiceQueryContinuation(Uri nextLinkUri, ProjectionPlan plan) 
        {
            Debug.Assert(nextLinkUri != null, "nextLinkUri != null"); 
            Debug.Assert(plan != null, "plan != null"); 

            this.nextLinkUri = nextLinkUri; 
            this.plan = plan;
        }

        #endregion Contructors. 

        #region Properties. 
 
        /// The URI to the next page of data.
        public Uri NextLinkUri 
        {
            get { return this.nextLinkUri; }
        }
 
        /// Type of element to be paged over.
        internal abstract Type ElementType 
        { 
            get;
        } 

        /// Projection plan for the next page of data; null if not available.
        internal ProjectionPlan Plan
        { 
            get { return this.plan; }
        } 
 
        #endregion Properties.
 
        #region Methods.

        /// Provides a string representation of this continuation.
        /// String representation. 
        public override string ToString()
        { 
            return this.NextLinkUri.ToString(); 
        }
 
        /// Creates a new  instance.
        /// Link to next page of data (possibly null).
        /// Plan to materialize the data (only null if nextLinkUri is null).
        /// A new continuation object; null if nextLinkUri is null. 
        internal static DataServiceQueryContinuation Create(Uri nextLinkUri, ProjectionPlan plan)
        { 
            Debug.Assert(plan != null || nextLinkUri == null, "plan != null || nextLinkUri == null"); 

            if (nextLinkUri == null) 
            {
                return null;
            }
 
            var constructors = typeof(DataServiceQueryContinuation<>).MakeGenericType(plan.ProjectedType).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance);
            Debug.Assert(constructors.Length == 1, "constructors.Length == 1"); 
            object result = Util.ConstructorInvoke(constructors[0], new object[] { nextLinkUri, plan }); 
            return (DataServiceQueryContinuation)result;
        } 

        /// 
        /// Initializes a new  instance that can
        /// be used for this continuation. 
        /// 
        /// A new initializes . 
        internal QueryComponents CreateQueryComponents() 
        {
            QueryComponents result = new QueryComponents(this.NextLinkUri, Util.DataServiceVersionEmpty, this.Plan.LastSegmentType, null, null); 
            return result;
        }

        #endregion Methods. 
    }
 
    /// Use this class to represent the continuation of a query. 
    /// Element type.
    public sealed class DataServiceQueryContinuation : DataServiceQueryContinuation 
    {
        #region Contructors.

        /// Initializes a new typed instance. 
        /// URI to next page of data.
        /// Projection plan for results of next page. 
        internal DataServiceQueryContinuation(Uri nextLinkUri, ProjectionPlan plan) 
            : base(nextLinkUri, plan)
        { 
        }

        #endregion Contructors.
 
        #region Properties.
 
        /// Type of element to be paged over. 
        internal override Type ElementType
        { 
            get { return typeof(T); }
        }

        #endregion Properties. 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.