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
- FormViewPageEventArgs.cs
- SchemaEntity.cs
- TabControlEvent.cs
- DataSourceSelectArguments.cs
- OpenTypeMethods.cs
- _NegotiateClient.cs
- PerformanceCounterPermissionAttribute.cs
- SystemIPv4InterfaceProperties.cs
- Lock.cs
- ForwardPositionQuery.cs
- Rotation3DAnimationBase.cs
- HierarchicalDataSourceIDConverter.cs
- SnapLine.cs
- Help.cs
- CodePrimitiveExpression.cs
- BuildResult.cs
- COAUTHINFO.cs
- GorillaCodec.cs
- embossbitmapeffect.cs
- UITypeEditors.cs
- Guid.cs
- DetailsViewAutoFormat.cs
- VisualBrush.cs
- MenuItemAutomationPeer.cs
- DataListItemCollection.cs
- Point3D.cs
- PublishLicense.cs
- PrintDocument.cs
- FilterElement.cs
- FontNamesConverter.cs
- CommandField.cs
- DBAsyncResult.cs
- AlignmentYValidation.cs
- NestedContainer.cs
- ResolvedKeyFrameEntry.cs
- TransportElement.cs
- ReferentialConstraintRoleElement.cs
- SessionStateUtil.cs
- Console.cs
- XPathBinder.cs
- ViewCellSlot.cs
- MetabaseSettings.cs
- Currency.cs
- Model3DGroup.cs
- DataGridCell.cs
- MimeMapping.cs
- LabelLiteral.cs
- MulticastIPAddressInformationCollection.cs
- XmlName.cs
- SelfIssuedTokenFactoryCredential.cs
- WebBrowserUriTypeConverter.cs
- DataGridViewCheckBoxColumn.cs
- PeerFlooder.cs
- DirectoryObjectSecurity.cs
- NetNamedPipeBinding.cs
- SmiTypedGetterSetter.cs
- GridViewColumnCollectionChangedEventArgs.cs
- DateTimeFormatInfo.cs
- DataServiceHostFactory.cs
- Repeater.cs
- UnionExpr.cs
- TextCompositionEventArgs.cs
- UxThemeWrapper.cs
- DbSource.cs
- DefaultSerializationProviderAttribute.cs
- Int64Converter.cs
- ToolboxItemWrapper.cs
- ZipIOLocalFileBlock.cs
- KernelTypeValidation.cs
- SystemColors.cs
- ZipFileInfo.cs
- ConfigurationValues.cs
- CorrelationKeyCalculator.cs
- BitmapPalette.cs
- DesignerEditorPartChrome.cs
- NavigationProgressEventArgs.cs
- TranslateTransform3D.cs
- sqlstateclientmanager.cs
- WebPartDeleteVerb.cs
- ProfessionalColorTable.cs
- SubpageParaClient.cs
- WindowsStatusBar.cs
- ZipIOEndOfCentralDirectoryBlock.cs
- AbandonedMutexException.cs
- ControlUtil.cs
- ExtensionWindow.cs
- MD5CryptoServiceProvider.cs
- CreateInstanceBinder.cs
- DataListCommandEventArgs.cs
- CollectionAdapters.cs
- AutomationPropertyInfo.cs
- UndoEngine.cs
- SQLBytesStorage.cs
- ISO2022Encoding.cs
- GridToolTip.cs
- CurrentChangingEventArgs.cs
- WebPartTransformerCollection.cs
- TreeNodeStyleCollection.cs
- ScriptingScriptResourceHandlerSection.cs
- X509CertificateChain.cs