Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SafeThreadHandle.cs
- Stack.cs
- PackUriHelper.cs
- AliasedSlot.cs
- BitVec.cs
- VirtualPath.cs
- ExceptionUtil.cs
- ResourcesGenerator.cs
- DataTableClearEvent.cs
- ClientBuildManagerCallback.cs
- LambdaCompiler.Unary.cs
- FontStretches.cs
- TreeNodeCollection.cs
- Semaphore.cs
- MouseActionValueSerializer.cs
- SocketElement.cs
- AsyncResult.cs
- FormsAuthentication.cs
- CodeArgumentReferenceExpression.cs
- XmlProcessingInstruction.cs
- ImageKeyConverter.cs
- OperationCanceledException.cs
- PointKeyFrameCollection.cs
- HandlerBase.cs
- TextRange.cs
- XmlSchemaObjectCollection.cs
- ScriptReferenceBase.cs
- RemotingConfiguration.cs
- DoubleLinkList.cs
- AssemblyHelper.cs
- webbrowsersite.cs
- HtmlElementEventArgs.cs
- ChtmlTextWriter.cs
- TrackBarRenderer.cs
- UIElement3D.cs
- MaskedTextProvider.cs
- InternalConfigRoot.cs
- BuildProvider.cs
- HeaderUtility.cs
- DependencyPropertyDescriptor.cs
- Command.cs
- TextStore.cs
- DataGridViewColumn.cs
- NegotiateStream.cs
- ControlParameter.cs
- SamlSecurityTokenAuthenticator.cs
- DataListCommandEventArgs.cs
- wgx_sdk_version.cs
- AddInProcess.cs
- BStrWrapper.cs
- SymLanguageType.cs
- ObjectDataSourceMethodEditor.cs
- AffineTransform3D.cs
- StubHelpers.cs
- DataListItem.cs
- Pens.cs
- InvalidCastException.cs
- ServiceRouteHandler.cs
- _ProxyRegBlob.cs
- ResumeStoryboard.cs
- SignedInfo.cs
- SqlUserDefinedTypeAttribute.cs
- DataGridViewColumnHeaderCell.cs
- SponsorHelper.cs
- EarlyBoundInfo.cs
- ZipIOExtraField.cs
- ListBase.cs
- BufferedWebEventProvider.cs
- KeyInstance.cs
- StyleCollection.cs
- ClientConvert.cs
- SessionStateModule.cs
- JoinElimination.cs
- SocketPermission.cs
- ServiceNameElementCollection.cs
- RootContext.cs
- ConsoleCancelEventArgs.cs
- TextSpanModifier.cs
- DataControlFieldCell.cs
- DataControlImageButton.cs
- CheckBoxBaseAdapter.cs
- AuthenticatedStream.cs
- RadioButtonRenderer.cs
- MemberAssignmentAnalysis.cs
- FillRuleValidation.cs
- DllNotFoundException.cs
- CodeChecksumPragma.cs
- PreProcessInputEventArgs.cs
- RequestQueryProcessor.cs
- DataBindingCollectionConverter.cs
- FormView.cs
- SMSvcHost.cs
- MobileCategoryAttribute.cs
- ResponseBodyWriter.cs
- ZipIOExtraFieldPaddingElement.cs
- Emitter.cs
- LoadedOrUnloadedOperation.cs
- CalendarTable.cs
- X500Name.cs