Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataWeb / Client / System / Data / Services / Client / ALinq / DataServiceQueryProvider.cs / 1625574 / DataServiceQueryProvider.cs
//----------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Query Provider for Linq to URI translatation
//
//
// @owner [....]
//---------------------------------------------------------------------
namespace System.Data.Services.Client
{
#region Namespaces.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
#endregion Namespaces.
///
/// QueryProvider implementation
///
internal sealed class DataServiceQueryProvider : IQueryProvider
{
/// DataServiceContext for query provider
internal readonly DataServiceContext Context;
/// Constructs a query provider based on the context passed in
/// The context for the query provider
internal DataServiceQueryProvider(DataServiceContext context)
{
this.Context = context;
}
#region IQueryProvider implementation
/// Factory method for creating DataServiceOrderedQuery based on expression
/// The expression for the new query
/// new DataServiceQuery
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Justification = "parameters are validated against null via CheckArgumentNull")]
public IQueryable CreateQuery(Expression expression)
{
Util.CheckArgumentNull(expression, "expression");
Type et = TypeSystem.GetElementType(expression.Type);
Type qt = typeof(DataServiceQuery<>.DataServiceOrderedQuery).MakeGenericType(et);
object[] args = new object[] { expression, this };
ConstructorInfo ci = qt.GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null,
new Type[] { typeof(Expression), typeof(DataServiceQueryProvider) },
null);
return (IQueryable)Util.ConstructorInvoke(ci, args);
}
/// Factory method for creating DataServiceOrderedQuery based on expression
/// generic type
/// The expression for the new query
/// new DataServiceQuery
public IQueryable CreateQuery(Expression expression)
{
Util.CheckArgumentNull(expression, "expression");
return new DataServiceQuery.DataServiceOrderedQuery(expression, this);
}
/// Creates and executes a DataServiceQuery based on the passed in expression
/// The expression for the new query
/// the results
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0", Justification = "parameters are validated against null via CheckArgumentNull")]
[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.NoInlining | System.Runtime.CompilerServices.MethodImplOptions.NoOptimization)]
public object Execute(Expression expression)
{
Util.CheckArgumentNull(expression, "expression");
MethodInfo mi = typeof(DataServiceQueryProvider).GetMethod("ReturnSingleton", BindingFlags.NonPublic | BindingFlags.Instance);
return mi.MakeGenericMethod(expression.Type).Invoke(this, new object[] { expression });
}
/// Creates and executes a DataServiceQuery based on the passed in expression
/// generic type
/// The expression for the new query
/// the results
public TResult Execute(Expression expression)
{
Util.CheckArgumentNull(expression, "expression");
return ReturnSingleton(expression);
}
#endregion
/// Creates and executes a DataServiceQuery based on the passed in expression which results a single value
/// generic type
/// The expression for the new query
/// single valued results
internal TElement ReturnSingleton(Expression expression)
{
IQueryable query = new DataServiceQuery.DataServiceOrderedQuery(expression, this);
MethodCallExpression mce = expression as MethodCallExpression;
Debug.Assert(mce != null, "mce != null");
SequenceMethod sequenceMethod;
if (ReflectionUtil.TryIdentifySequenceMethod(mce.Method, out sequenceMethod))
{
switch (sequenceMethod)
{
case SequenceMethod.Single:
return query.AsEnumerable().Single();
case SequenceMethod.SingleOrDefault:
return query.AsEnumerable().SingleOrDefault();
case SequenceMethod.First:
return query.AsEnumerable().First();
case SequenceMethod.FirstOrDefault:
return query.AsEnumerable().FirstOrDefault();
#if !ASTORIA_LIGHT
case SequenceMethod.LongCount:
case SequenceMethod.Count:
return (TElement)Convert.ChangeType(((DataServiceQuery)query).GetQuerySetCount(this.Context), typeof(TElement), System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
#endif
default:
throw Error.MethodNotSupported(mce);
}
}
// Should never get here - should be caught by expression compiler.
Debug.Assert(false, "Not supported singleton operator not caught by Resource Binder");
throw Error.MethodNotSupported(mce);
}
/// Builds the Uri for the expression passed in.
/// The expression to translate into a Uri
/// Query components
internal QueryComponents Translate(Expression e)
{
Uri uri;
Version version;
bool addTrailingParens = false;
Dictionary normalizerRewrites = null;
// short cut analysis if just a resource set
// note - to be backwards compatible with V1, will only append trailing () for queries
// that include more then just a resource set.
if (!(e is ResourceSetExpression))
{
normalizerRewrites = new Dictionary(ReferenceEqualityComparer.Instance);
e = Evaluator.PartialEval(e);
e = ExpressionNormalizer.Normalize(e, normalizerRewrites);
e = ResourceBinder.Bind(e);
addTrailingParens = true;
}
UriWriter.Translate(this.Context, addTrailingParens, e, out uri, out version);
ResourceExpression re = e as ResourceExpression;
Type lastSegmentType = re.Projection == null ? re.ResourceType : re.Projection.Selector.Parameters[0].Type;
LambdaExpression selector = re.Projection == null ? null : re.Projection.Selector;
return new QueryComponents(uri, version, lastSegmentType, selector, normalizerRewrites);
}
}
}
// 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
- ADConnectionHelper.cs
- EntityDataSourceQueryBuilder.cs
- LinkedResource.cs
- SizeF.cs
- SiteMapNodeItemEventArgs.cs
- IdSpace.cs
- VisualBrush.cs
- AnnotationResourceCollection.cs
- EmptyStringExpandableObjectConverter.cs
- LicenseProviderAttribute.cs
- ServiceDiscoveryBehavior.cs
- OutputScopeManager.cs
- StateBag.cs
- HttpResponse.cs
- SafeNativeMethods.cs
- ServiceCredentialsElement.cs
- TextRangeSerialization.cs
- documentation.cs
- FieldBuilder.cs
- BuildResultCache.cs
- PingReply.cs
- ElementNotEnabledException.cs
- ExpressionConverter.cs
- DrawingCollection.cs
- DiscoveryOperationContextExtension.cs
- MainMenu.cs
- ObjectHandle.cs
- DataGridViewTextBoxEditingControl.cs
- TdsValueSetter.cs
- XmlSchemaDatatype.cs
- Mouse.cs
- NegationPusher.cs
- ResourceExpressionBuilder.cs
- BaseCAMarshaler.cs
- ReferencedCategoriesDocument.cs
- ParentUndoUnit.cs
- safelink.cs
- ListControlDataBindingHandler.cs
- UdpDiscoveryEndpoint.cs
- HtmlFormWrapper.cs
- CopyCodeAction.cs
- DeclaredTypeElement.cs
- DataContractJsonSerializerOperationFormatter.cs
- PropertyValueChangedEvent.cs
- XmlNodeComparer.cs
- HtmlElement.cs
- Sentence.cs
- _AutoWebProxyScriptEngine.cs
- XmlNamespaceDeclarationsAttribute.cs
- WindowsGraphicsWrapper.cs
- WebPartCloseVerb.cs
- PasswordDeriveBytes.cs
- CqlParser.cs
- PropertyGridView.cs
- PieceDirectory.cs
- InheritanceRules.cs
- ContentPosition.cs
- XPathDocument.cs
- LinearKeyFrames.cs
- LayoutExceptionEventArgs.cs
- SqlSupersetValidator.cs
- ActivityTypeCodeDomSerializer.cs
- CodeRemoveEventStatement.cs
- newinstructionaction.cs
- FamilyTypeface.cs
- StrongNameMembershipCondition.cs
- Decoder.cs
- PathGeometry.cs
- SystemWebCachingSectionGroup.cs
- HtmlShim.cs
- RegisteredScript.cs
- CompressEmulationStream.cs
- RSAOAEPKeyExchangeDeformatter.cs
- ContractComponent.cs
- VectorCollectionConverter.cs
- MenuTracker.cs
- SafeHandles.cs
- PropertyCondition.cs
- XmlSchemaChoice.cs
- SqlStream.cs
- ModelItemDictionaryImpl.cs
- SerializationInfoEnumerator.cs
- DataControlButton.cs
- XmlSchemaCollection.cs
- FunctionQuery.cs
- BitmapMetadataBlob.cs
- XappLauncher.cs
- GenericIdentity.cs
- Predicate.cs
- ListViewAutomationPeer.cs
- HeaderCollection.cs
- TailCallAnalyzer.cs
- DependencyObject.cs
- _StreamFramer.cs
- PenLineJoinValidation.cs
- TemplateComponentConnector.cs
- SimpleWebHandlerParser.cs
- ApplicationInfo.cs
- MouseActionValueSerializer.cs
- MergePropertyDescriptor.cs