Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataEntity / System / Data / Objects / ObjectQuery.cs / 2 / 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
{
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 will not result in an exception caused during
/// compilation of this query into a provider command.
///
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.
//----------------------------------------------------------------------
//
// 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
{
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 will not result in an exception caused during
/// compilation of this query into a provider command.
///
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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- NameValuePermission.cs
- WebControlsSection.cs
- X500Name.cs
- DataGridBeginningEditEventArgs.cs
- DeviceContext.cs
- DelayedRegex.cs
- ControlPropertyNameConverter.cs
- WebPartConnectionsConnectVerb.cs
- SoapHeaderException.cs
- TraceInternal.cs
- AuthenticationService.cs
- OdbcDataAdapter.cs
- Vector3DConverter.cs
- OciHandle.cs
- InternalCompensate.cs
- IFlowDocumentViewer.cs
- WindowsRebar.cs
- XmlSchemaGroup.cs
- LayoutEditorPart.cs
- WebReferencesBuildProvider.cs
- PerformanceCounterPermissionEntry.cs
- ResourcesChangeInfo.cs
- WebPartEditorOkVerb.cs
- XPathParser.cs
- DebugTracing.cs
- DependencyObject.cs
- StringToken.cs
- UnsafeNativeMethods.cs
- Marshal.cs
- Rectangle.cs
- CqlQuery.cs
- ViewGenResults.cs
- TableAutomationPeer.cs
- ConnectionPointCookie.cs
- LoadItemsEventArgs.cs
- AuthenticationException.cs
- XmlSerializerNamespaces.cs
- cookie.cs
- WebPartConnectionsCloseVerb.cs
- ToolTipAutomationPeer.cs
- uribuilder.cs
- SafeThreadHandle.cs
- RSAOAEPKeyExchangeDeformatter.cs
- WebContext.cs
- CacheDependency.cs
- IPAddressCollection.cs
- ResourceDescriptionAttribute.cs
- Formatter.cs
- ReceiveActivityValidator.cs
- DbModificationClause.cs
- DictionarySurrogate.cs
- FillBehavior.cs
- ColorComboBox.cs
- LocatorManager.cs
- counter.cs
- ColorMatrix.cs
- StylusEventArgs.cs
- CopyAction.cs
- DataGridSortCommandEventArgs.cs
- ReachDocumentReferenceCollectionSerializerAsync.cs
- SafeNativeMethodsCLR.cs
- Attributes.cs
- RelatedImageListAttribute.cs
- CatalogZoneBase.cs
- AutomationElementCollection.cs
- CacheSection.cs
- DesignerDataSchemaClass.cs
- PathSegmentCollection.cs
- GAC.cs
- ListControlDesigner.cs
- AssemblyLoader.cs
- GestureRecognitionResult.cs
- FullTextLine.cs
- XPathNavigatorKeyComparer.cs
- SatelliteContractVersionAttribute.cs
- SqlDataSourceDesigner.cs
- Renderer.cs
- WbemException.cs
- WebPartConnectionsDisconnectVerb.cs
- COSERVERINFO.cs
- DynamicExpression.cs
- SignatureToken.cs
- MultitargetingHelpers.cs
- AnonymousIdentificationSection.cs
- QueryTaskGroupState.cs
- PrintPreviewControl.cs
- Matrix.cs
- UTF7Encoding.cs
- AndMessageFilter.cs
- CardSpaceSelector.cs
- TableHeaderCell.cs
- ChtmlTextWriter.cs
- UnaryNode.cs
- CaseInsensitiveHashCodeProvider.cs
- InvalidCastException.cs
- ReadContentAsBinaryHelper.cs
- TakeQueryOptionExpression.cs
- CommandLineParser.cs
- CompilerState.cs
- TypefaceMap.cs