Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataWeb / Client / System / Data / Services / Client / ALinq / ProjectionRewriter.cs / 1305376 / ProjectionRewriter.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // //// Tries to remove transparent identifiers from selector expressions // so it can be used as a projection. // // // @owner [....] //--------------------------------------------------------------------- namespace System.Data.Services.Client { #region Namespaces. using System; using System.Diagnostics; using System.Linq; using System.Linq.Expressions; #endregion Namespaces. internal class ProjectionRewriter : ALinqExpressionVisitor { #region Private fields. private readonly ParameterExpression newLambdaParameter; private ParameterExpression oldLambdaParameter; private bool sucessfulRebind; #endregion Private fields. private ProjectionRewriter(Type proposedParameterType) { Debug.Assert(proposedParameterType != null, "proposedParameterType != null"); this.newLambdaParameter = Expression.Parameter(proposedParameterType, "it"); } #region Internal methods. internal static LambdaExpression TryToRewrite(LambdaExpression le, Type proposedParameterType) { LambdaExpression result; if (!ResourceBinder.PatternRules.MatchSingleArgumentLambda(le, out le) || // can only rewrite single parameter Lambdas. ClientType.CheckElementTypeIsEntity(le.Parameters[0].Type) || // only attempt to rewrite if lambda parameter is not an entity type !(le.Parameters[0].Type.GetProperties().Any(p => p.PropertyType == proposedParameterType))) // lambda parameter must have public property that is same as proposed type. { result = le; } else { ProjectionRewriter rewriter = new ProjectionRewriter(proposedParameterType); result = rewriter.Rebind(le); } return result; } internal LambdaExpression Rebind(LambdaExpression lambda) { this.sucessfulRebind = true; this.oldLambdaParameter = lambda.Parameters[0]; Expression body = this.Visit(lambda.Body); if (this.sucessfulRebind) { Type delegateType = typeof(Func<,>).MakeGenericType(new Type[] { newLambdaParameter.Type, lambda.Body.Type }); #if ASTORIA_LIGHT return ExpressionHelpers.CreateLambda(delegateType, body, new ParameterExpression[] { this.newLambdaParameter }); #else return Expression.Lambda(delegateType, body, new ParameterExpression[] { this.newLambdaParameter }); #endif } else { throw new NotSupportedException(Strings.ALinq_CanOnlyProjectTheLeaf); } } internal override Expression VisitMemberAccess(MemberExpression m) { if (m.Expression == this.oldLambdaParameter) { if (m.Type == this.newLambdaParameter.Type) { return this.newLambdaParameter; } else { this.sucessfulRebind = false; } } return base.VisitMemberAccess(m); } #endregion Internal methods. } } // 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
- LockedHandleGlyph.cs
- WebServiceReceive.cs
- ArrangedElementCollection.cs
- CodeCompileUnit.cs
- Keywords.cs
- Vector3dCollection.cs
- StatusBar.cs
- Timeline.cs
- ListViewItemSelectionChangedEvent.cs
- ErrorWrapper.cs
- BitmapEffectGroup.cs
- ResourceIDHelper.cs
- GuidConverter.cs
- Interlocked.cs
- BooleanStorage.cs
- DataBoundControlDesigner.cs
- SecurityContextSecurityTokenParameters.cs
- ClientFormsAuthenticationCredentials.cs
- StringReader.cs
- ComponentDesigner.cs
- IndicCharClassifier.cs
- Win32.cs
- ColorBuilder.cs
- RelatedPropertyManager.cs
- SpellerError.cs
- BindableAttribute.cs
- IriParsingElement.cs
- MetadataProperty.cs
- DataGridViewSortCompareEventArgs.cs
- Vector3DAnimationBase.cs
- PreservationFileReader.cs
- DataBindingHandlerAttribute.cs
- AnimatedTypeHelpers.cs
- SqlDataAdapter.cs
- SqlDuplicator.cs
- DrawingContextFlattener.cs
- ProvideValueServiceProvider.cs
- VirtualPathData.cs
- DesignTimeType.cs
- Profiler.cs
- ControlFilterExpression.cs
- AnnotationStore.cs
- DrawingContextFlattener.cs
- SerializationAttributes.cs
- Clause.cs
- IdnMapping.cs
- MouseCaptureWithinProperty.cs
- EllipseGeometry.cs
- As.cs
- HttpRequestCacheValidator.cs
- TTSEngineTypes.cs
- ListControl.cs
- TaskHelper.cs
- HostingEnvironmentSection.cs
- StorageComplexPropertyMapping.cs
- ContainerUIElement3D.cs
- StoreItemCollection.Loader.cs
- PerspectiveCamera.cs
- HuffCodec.cs
- GridViewColumnCollectionChangedEventArgs.cs
- PreviewKeyDownEventArgs.cs
- ProcessHostFactoryHelper.cs
- TypeUsageBuilder.cs
- PermissionSetTriple.cs
- ExtensibleClassFactory.cs
- ParallelTimeline.cs
- safesecurityhelperavalon.cs
- _Events.cs
- Rect3DConverter.cs
- UrlMappingsModule.cs
- FreeFormDesigner.cs
- OneOfScalarConst.cs
- BaseDataBoundControl.cs
- SpecialNameAttribute.cs
- MetadataHelper.cs
- EntityConnectionStringBuilderItem.cs
- BuildResultCache.cs
- ExternalException.cs
- XmlSchemaGroup.cs
- HeaderedItemsControl.cs
- DBSqlParserTable.cs
- RecognizedWordUnit.cs
- ConfigurationStrings.cs
- ProvidersHelper.cs
- FilteredReadOnlyMetadataCollection.cs
- Bookmark.cs
- TextPenaltyModule.cs
- BaseTemplateBuildProvider.cs
- Stream.cs
- XmlSchemaDatatype.cs
- ApplicationHost.cs
- EditingCommands.cs
- CodeParameterDeclarationExpression.cs
- BuildProviderCollection.cs
- IdentityModelDictionary.cs
- FactoryGenerator.cs
- NamespaceDecl.cs
- Splitter.cs
- ServiceDocumentFormatter.cs
- IntSecurity.cs