Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / ndp / fx / src / DataEntity / System / Data / Objects / ObjectQuery.cs / 3 / 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 private TypeUsage _resultType; #endregion #region Internal Constructors // -------------------- // Internal Constructors // -------------------- ///method is called. /// /// 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 { Expression retExpr; if (!this._state.TryGetExpression(out retExpr)) { retExpr = Expression.Constant(this); } return retExpr; } } ////// Gets the IQueryProvider associated with this query instance. /// IQueryProvider IQueryable.Provider { get { return this.Context.Provider; } } #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 ////// This method returns successfully only if the query is valid enough to attempt execution - /// that is, calling internal void Validate() { this._state.GetExecutionPlan(null); } 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. //---------------------------------------------------------------------- //will not result in an exception caused during /// compilation of this query into a provider command. /// // 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 private TypeUsage _resultType; #endregion #region Internal Constructors // -------------------- // Internal Constructors // -------------------- ///method is called. /// /// 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 { Expression retExpr; if (!this._state.TryGetExpression(out retExpr)) { retExpr = Expression.Constant(this); } return retExpr; } } ////// Gets the IQueryProvider associated with this query instance. /// IQueryProvider IQueryable.Provider { get { return this.Context.Provider; } } #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 ////// This method returns successfully only if the query is valid enough to attempt execution - /// that is, calling internal void Validate() { this._state.GetExecutionPlan(null); } 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.will not result in an exception caused during /// compilation of this query into a provider command. ///
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DecoderBestFitFallback.cs
- SafeHandles.cs
- WebRequestModuleElementCollection.cs
- QilXmlWriter.cs
- LeftCellWrapper.cs
- AxHost.cs
- DataObjectAttribute.cs
- WebBrowserPermission.cs
- WindowsFormsSynchronizationContext.cs
- Vector3DAnimation.cs
- HtmlForm.cs
- VarRemapper.cs
- ValidationHelper.cs
- ColorMatrix.cs
- FileLevelControlBuilderAttribute.cs
- TextBlock.cs
- util.cs
- GACMembershipCondition.cs
- QueryExpr.cs
- TextEditorThreadLocalStore.cs
- SmiContext.cs
- ValidatingReaderNodeData.cs
- UntrustedRecipientException.cs
- NeutralResourcesLanguageAttribute.cs
- SqlCacheDependencySection.cs
- ServerValidateEventArgs.cs
- XamlVector3DCollectionSerializer.cs
- ServiceDescriptionData.cs
- TableLayoutColumnStyleCollection.cs
- IgnoreSectionHandler.cs
- UITypeEditors.cs
- MouseGestureValueSerializer.cs
- UIElementAutomationPeer.cs
- IndexerNameAttribute.cs
- SoapProcessingBehavior.cs
- ComboBoxDesigner.cs
- DataControlCommands.cs
- UrlMappingsSection.cs
- PopupRootAutomationPeer.cs
- WriteableBitmap.cs
- XamlTypeMapper.cs
- EntityDataSource.cs
- InputDevice.cs
- WindowsScrollBarBits.cs
- AddInEnvironment.cs
- IERequestCache.cs
- WeakReferenceEnumerator.cs
- FragmentQueryKB.cs
- StylusPointDescription.cs
- ScanQueryOperator.cs
- CaseInsensitiveHashCodeProvider.cs
- NativeMethods.cs
- WsdlInspector.cs
- SerTrace.cs
- GeneralTransform3DTo2DTo3D.cs
- Point4D.cs
- documentsequencetextview.cs
- SendingRequestEventArgs.cs
- FontUnit.cs
- DeploymentExceptionMapper.cs
- ColorContext.cs
- ExtensionDataObject.cs
- EmptyEnumerable.cs
- LocalizedNameDescriptionPair.cs
- XPathScanner.cs
- ColorPalette.cs
- MimeWriter.cs
- ConfigurationFileMap.cs
- TextTreeObjectNode.cs
- mediaeventshelper.cs
- _LocalDataStoreMgr.cs
- ClientSettingsSection.cs
- SizeConverter.cs
- Mapping.cs
- TextParagraphProperties.cs
- SchemaAttDef.cs
- WindowsScroll.cs
- DeclarationUpdate.cs
- NumericExpr.cs
- RoutedPropertyChangedEventArgs.cs
- ClientScriptItemCollection.cs
- TypedAsyncResult.cs
- XD.cs
- DeploymentExceptionMapper.cs
- DataRowExtensions.cs
- WindowsScrollBarBits.cs
- LoginStatusDesigner.cs
- WorkflowWebService.cs
- messageonlyhwndwrapper.cs
- COM2ExtendedTypeConverter.cs
- IPAddressCollection.cs
- UpdatePanelControlTrigger.cs
- SingleStorage.cs
- InfoCardTrace.cs
- DiagnosticsConfiguration.cs
- ButtonFieldBase.cs
- Int32.cs
- InfoCardBinaryReader.cs
- HttpFileCollectionWrapper.cs
- TextRangeBase.cs