ObjectQuery.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Objects / ObjectQuery.cs / 1305376 / ObjectQuery.cs

                            //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner [....]
// @backupowner [....] 
//--------------------------------------------------------------------- 

using System; 
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel; 
using System.Globalization;
using System.Diagnostics; 
using System.Data; 
using System.Data.Common;
using System.Data.Common.EntitySql; 
using System.Data.Common.Utils;
using System.Data.Mapping;
using System.Data.Metadata.Edm;
using System.Data.Common.CommandTrees; 
using System.Data.Common.CommandTrees.Internal;
using System.Data.Objects.DataClasses; 
using System.Data.Objects.ELinq; 
using System.Data.Objects.Internal;
using System.Data.Common.QueryCache; 
using System.Data.EntityClient;
using System.Linq;
using System.Linq.Expressions;
 
namespace System.Data.Objects
{ 
    ///  
    ///   This class implements untyped queries at the object-layer.
    ///  
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]
    public abstract class ObjectQuery : IEnumerable, IQueryable, IOrderedQueryable, IListSource
    {
        #region Private Instance Members 

        // ----------------- 
        // Instance Fields 
        // -----------------
 
        /// 
        ///   The underlying implementation of this ObjectQuery as provided by a concrete subclass
        ///   of ObjectQueryImplementation. Implementations currently exist for Entity-SQL- and Linq-to-Entities-based ObjectQueries.
        ///  
        private ObjectQueryState _state;
 
        ///  
        ///   The result type of the query - 'TResultType' expressed as an O-Space type usage. Cached here and
        ///   only instantiated if the  method is called. 
        /// 
        private TypeUsage _resultType;

        #endregion 

        #region Internal Constructors 
 
        // --------------------
        // Internal Constructors 
        // --------------------

        /// 
        ///   The common constructor. 
        /// 
        ///  
        ///   The underlying implementation of this ObjectQuery 
        /// 
        ///  
        ///   A new ObjectQuery instance.
        /// 
        internal ObjectQuery(ObjectQueryState queryState)
        { 
            Debug.Assert(queryState != null, "ObjectQuery state cannot be null");
 
            // Set the query state. 
            this._state = queryState;
 
            // Flag that indicates if this ObjectQuery query plan has to be cached
            // Future Enhancement: Read the value of this setting from a 'global' configuration such as an .exe.config section
            this._state.PlanCachingEnabled = true;
        } 

        #endregion 
 
        #region Internal Properties
 
        /// 
        /// Gets an untyped instantiation of the underlying ObjectQueryState that implements this ObjectQuery.
        /// 
        internal ObjectQueryState QueryState { get { return this._state; } } 

        #endregion 
 
        #region IQueryable implementation
 
        /// 
        /// Gets the result element type for this query instance.
        /// 
        Type IQueryable.ElementType 
        {
            get { return this._state.ElementType;; } 
        } 

        ///  
        /// Gets the expression describing this query. For queries built using
        /// LINQ builder patterns, returns a full LINQ expression tree; otherwise,
        /// returns a constant expression wrapping this query. Note that the
        /// default expression is not cached. This allows us to differentiate 
        /// between LINQ and Entity-SQL queries.
        ///  
        System.Linq.Expressions.Expression IQueryable.Expression 
        {
            get 
            {
                return this.GetExpression();
            }
        } 

        internal abstract System.Linq.Expressions.Expression GetExpression(); 
 
        /// 
        /// Gets the IQueryProvider associated with this query instance. 
        /// 
        IQueryProvider IQueryable.Provider { get { return this.Context.QueryProvider; } }

        #endregion 

        #region Public Properties 
 
        // ----------
        // Properties 
        // ----------

        // ----------------------
        // IListSource  Properties 
        // ----------------------
        ///  
        ///   IListSource.ContainsListCollection implementation. Always returns true. 
        /// 
        bool IListSource.ContainsListCollection 
        {
            get
            {
                return false; // this means that the IList we return is the one which contains our actual data, it is not a collection 
            }
        } 
 
        /// 
        /// Gets the Command Text (if any) for this ObjectQuery. 
        /// 
        public string CommandText
        {
            get 
            {
                string commandText; 
                if (!_state.TryGetCommandText(out commandText)) 
                {
                    return String.Empty; 
                }

                Debug.Assert(commandText != null && commandText.Length != 0, "Invalid Command Text returned");
                return commandText; 
            }
        } 
 
        /// 
        ///   The context for the query, which includes the connection, cache and 
        ///   metadata. Note that only the connection property is mutable and must be
        ///   set before a query can be executed.
        /// 
        public ObjectContext Context 
        {
            get 
            { 
                return this._state.ObjectContext;
            } 
        }

        /// 
        ///   Allows optional control over how queried results interact with the object state manager. 
        /// 
        public MergeOption MergeOption 
        { 
            get
            { 
                return this._state.EffectiveMergeOption;
            }

            set 
            {
                EntityUtil.CheckArgumentMergeOption(value); 
                this._state.UserSpecifiedMergeOption = value; 
            }
        } 

        /// 
        ///   The parameter collection for this query.
        ///  
        public ObjectParameterCollection Parameters
        { 
            get 
            {
                return this._state.EnsureParameters(); 
            }
        }

        ///  
        ///   Defines if the query plan should be cached
        ///  
        public bool EnablePlanCaching 
        {
            get 
            {
                return this._state.PlanCachingEnabled;
            }
 
            set
            { 
                this._state.PlanCachingEnabled = value; 
            }
        } 

        #endregion

        #region Public Methods 

        // -------------- 
        // Public Methods 
        // --------------
 
        // ----------------------
        // IListSource  method
        // ----------------------
        ///  
        ///   IListSource.GetList implementation
        ///  
        ///  
        ///   IList interface over the data to bind
        ///  
        IList IListSource.GetList()
        {
            return this.GetIListSourceListInternal();
        } 

        ///  
        ///   Get the provider-specific command text used to execute this query 
        /// 
        ///  
        [Browsable(false)]
        public string ToTraceString()
        {
            return this._state.GetExecutionPlan(null).ToTraceString(); 
        }
 
        ///  
        ///   This method returns information about the result type of the ObjectQuery.
        ///  
        /// 
        ///   The TypeMetadata that describes the shape of the query results.
        /// 
        public TypeUsage GetResultType () 
        {
            Context.EnsureMetadata(); 
            if (null == this._resultType) 
            {
                // Retrieve the result type from the implementation, in terms of C-Space. 
                TypeUsage cSpaceQueryResultType = this._state.ResultType;

                // Determine the 'TResultType' equivalent type usage based on the mapped O-Space type.
                // If the result type of the query is a collection[something], then 
                // extract out the 'something' (element type) and use that. This
                // is the equivalent of saying the result type is T, rather than 
                // IEnumerable, which aligns with users' expectations. 
                TypeUsage tResultType;
                if (!TypeHelpers.TryGetCollectionElementType(cSpaceQueryResultType, out tResultType)) 
                {
                    tResultType = cSpaceQueryResultType;
                }
 
                // Map the C-space result type to O-space.
                tResultType = this._state.ObjectContext.Perspective.MetadataWorkspace.GetOSpaceTypeUsage(tResultType); 
                if (null == tResultType) 
                {
                    throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.ObjectQuery_UnableToMapResultType); 
                }

                this._resultType = tResultType;
            } 

            return this._resultType; 
        } 

        ///  
        ///   This method allows explicit query evaluation with a specified merge
        ///   option which will override the merge option property.
        /// 
        ///  
        ///   The MergeOption to use when executing the query.
        ///  
        ///  
        ///   An enumerable for the ObjectQuery results.
        ///  
        public ObjectResult Execute(MergeOption mergeOption)
        {
            EntityUtil.CheckArgumentMergeOption(mergeOption);
            return this.ExecuteInternal(mergeOption); 
        }
 
        #region IEnumerable implementation 

        IEnumerator IEnumerable.GetEnumerator() 
        {
            return this.GetEnumeratorInternal();
        }
 
        #endregion
 
        #endregion 

        #region Internal Methods 
        internal abstract IEnumerator GetEnumeratorInternal();
        internal abstract IList GetIListSourceListInternal();
        internal abstract ObjectResult ExecuteInternal(MergeOption mergeOption);
        #endregion 
    }
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner [....]
// @backupowner [....] 
//--------------------------------------------------------------------- 

using System; 
using System.Text.RegularExpressions;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel; 
using System.Globalization;
using System.Diagnostics; 
using System.Data; 
using System.Data.Common;
using System.Data.Common.EntitySql; 
using System.Data.Common.Utils;
using System.Data.Mapping;
using System.Data.Metadata.Edm;
using System.Data.Common.CommandTrees; 
using System.Data.Common.CommandTrees.Internal;
using System.Data.Objects.DataClasses; 
using System.Data.Objects.ELinq; 
using System.Data.Objects.Internal;
using System.Data.Common.QueryCache; 
using System.Data.EntityClient;
using System.Linq;
using System.Linq.Expressions;
 
namespace System.Data.Objects
{ 
    ///  
    ///   This class implements untyped queries at the object-layer.
    ///  
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")]
    public abstract class ObjectQuery : IEnumerable, IQueryable, IOrderedQueryable, IListSource
    {
        #region Private Instance Members 

        // ----------------- 
        // Instance Fields 
        // -----------------
 
        /// 
        ///   The underlying implementation of this ObjectQuery as provided by a concrete subclass
        ///   of ObjectQueryImplementation. Implementations currently exist for Entity-SQL- and Linq-to-Entities-based ObjectQueries.
        ///  
        private ObjectQueryState _state;
 
        ///  
        ///   The result type of the query - 'TResultType' expressed as an O-Space type usage. Cached here and
        ///   only instantiated if the  method is called. 
        /// 
        private TypeUsage _resultType;

        #endregion 

        #region Internal Constructors 
 
        // --------------------
        // Internal Constructors 
        // --------------------

        /// 
        ///   The common constructor. 
        /// 
        ///  
        ///   The underlying implementation of this ObjectQuery 
        /// 
        ///  
        ///   A new ObjectQuery instance.
        /// 
        internal ObjectQuery(ObjectQueryState queryState)
        { 
            Debug.Assert(queryState != null, "ObjectQuery state cannot be null");
 
            // Set the query state. 
            this._state = queryState;
 
            // Flag that indicates if this ObjectQuery query plan has to be cached
            // Future Enhancement: Read the value of this setting from a 'global' configuration such as an .exe.config section
            this._state.PlanCachingEnabled = true;
        } 

        #endregion 
 
        #region Internal Properties
 
        /// 
        /// Gets an untyped instantiation of the underlying ObjectQueryState that implements this ObjectQuery.
        /// 
        internal ObjectQueryState QueryState { get { return this._state; } } 

        #endregion 
 
        #region IQueryable implementation
 
        /// 
        /// Gets the result element type for this query instance.
        /// 
        Type IQueryable.ElementType 
        {
            get { return this._state.ElementType;; } 
        } 

        ///  
        /// Gets the expression describing this query. For queries built using
        /// LINQ builder patterns, returns a full LINQ expression tree; otherwise,
        /// returns a constant expression wrapping this query. Note that the
        /// default expression is not cached. This allows us to differentiate 
        /// between LINQ and Entity-SQL queries.
        ///  
        System.Linq.Expressions.Expression IQueryable.Expression 
        {
            get 
            {
                return this.GetExpression();
            }
        } 

        internal abstract System.Linq.Expressions.Expression GetExpression(); 
 
        /// 
        /// Gets the IQueryProvider associated with this query instance. 
        /// 
        IQueryProvider IQueryable.Provider { get { return this.Context.QueryProvider; } }

        #endregion 

        #region Public Properties 
 
        // ----------
        // Properties 
        // ----------

        // ----------------------
        // IListSource  Properties 
        // ----------------------
        ///  
        ///   IListSource.ContainsListCollection implementation. Always returns true. 
        /// 
        bool IListSource.ContainsListCollection 
        {
            get
            {
                return false; // this means that the IList we return is the one which contains our actual data, it is not a collection 
            }
        } 
 
        /// 
        /// Gets the Command Text (if any) for this ObjectQuery. 
        /// 
        public string CommandText
        {
            get 
            {
                string commandText; 
                if (!_state.TryGetCommandText(out commandText)) 
                {
                    return String.Empty; 
                }

                Debug.Assert(commandText != null && commandText.Length != 0, "Invalid Command Text returned");
                return commandText; 
            }
        } 
 
        /// 
        ///   The context for the query, which includes the connection, cache and 
        ///   metadata. Note that only the connection property is mutable and must be
        ///   set before a query can be executed.
        /// 
        public ObjectContext Context 
        {
            get 
            { 
                return this._state.ObjectContext;
            } 
        }

        /// 
        ///   Allows optional control over how queried results interact with the object state manager. 
        /// 
        public MergeOption MergeOption 
        { 
            get
            { 
                return this._state.EffectiveMergeOption;
            }

            set 
            {
                EntityUtil.CheckArgumentMergeOption(value); 
                this._state.UserSpecifiedMergeOption = value; 
            }
        } 

        /// 
        ///   The parameter collection for this query.
        ///  
        public ObjectParameterCollection Parameters
        { 
            get 
            {
                return this._state.EnsureParameters(); 
            }
        }

        ///  
        ///   Defines if the query plan should be cached
        ///  
        public bool EnablePlanCaching 
        {
            get 
            {
                return this._state.PlanCachingEnabled;
            }
 
            set
            { 
                this._state.PlanCachingEnabled = value; 
            }
        } 

        #endregion

        #region Public Methods 

        // -------------- 
        // Public Methods 
        // --------------
 
        // ----------------------
        // IListSource  method
        // ----------------------
        ///  
        ///   IListSource.GetList implementation
        ///  
        ///  
        ///   IList interface over the data to bind
        ///  
        IList IListSource.GetList()
        {
            return this.GetIListSourceListInternal();
        } 

        ///  
        ///   Get the provider-specific command text used to execute this query 
        /// 
        ///  
        [Browsable(false)]
        public string ToTraceString()
        {
            return this._state.GetExecutionPlan(null).ToTraceString(); 
        }
 
        ///  
        ///   This method returns information about the result type of the ObjectQuery.
        ///  
        /// 
        ///   The TypeMetadata that describes the shape of the query results.
        /// 
        public TypeUsage GetResultType () 
        {
            Context.EnsureMetadata(); 
            if (null == this._resultType) 
            {
                // Retrieve the result type from the implementation, in terms of C-Space. 
                TypeUsage cSpaceQueryResultType = this._state.ResultType;

                // Determine the 'TResultType' equivalent type usage based on the mapped O-Space type.
                // If the result type of the query is a collection[something], then 
                // extract out the 'something' (element type) and use that. This
                // is the equivalent of saying the result type is T, rather than 
                // IEnumerable, which aligns with users' expectations. 
                TypeUsage tResultType;
                if (!TypeHelpers.TryGetCollectionElementType(cSpaceQueryResultType, out tResultType)) 
                {
                    tResultType = cSpaceQueryResultType;
                }
 
                // Map the C-space result type to O-space.
                tResultType = this._state.ObjectContext.Perspective.MetadataWorkspace.GetOSpaceTypeUsage(tResultType); 
                if (null == tResultType) 
                {
                    throw EntityUtil.InvalidOperation(System.Data.Entity.Strings.ObjectQuery_UnableToMapResultType); 
                }

                this._resultType = tResultType;
            } 

            return this._resultType; 
        } 

        ///  
        ///   This method allows explicit query evaluation with a specified merge
        ///   option which will override the merge option property.
        /// 
        ///  
        ///   The MergeOption to use when executing the query.
        ///  
        ///  
        ///   An enumerable for the ObjectQuery results.
        ///  
        public ObjectResult Execute(MergeOption mergeOption)
        {
            EntityUtil.CheckArgumentMergeOption(mergeOption);
            return this.ExecuteInternal(mergeOption); 
        }
 
        #region IEnumerable implementation 

        IEnumerator IEnumerable.GetEnumerator() 
        {
            return this.GetEnumeratorInternal();
        }
 
        #endregion
 
        #endregion 

        #region Internal Methods 
        internal abstract IEnumerator GetEnumeratorInternal();
        internal abstract IList GetIListSourceListInternal();
        internal abstract ObjectResult ExecuteInternal(MergeOption mergeOption);
        #endregion 
    }
} 

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

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK