Code:
/ 4.0 / 4.0 / 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. //---------------------------------------------------------------------- //// 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
- UserPreferenceChangingEventArgs.cs
- AbsoluteQuery.cs
- MessageAction.cs
- ServicePointManagerElement.cs
- ClonableStack.cs
- HttpCookie.cs
- AuthorizationRuleCollection.cs
- XsdDataContractExporter.cs
- BitmapCache.cs
- RowVisual.cs
- TreeNodeStyle.cs
- CodeDefaultValueExpression.cs
- MobileTextWriter.cs
- safex509handles.cs
- RadioButton.cs
- ImageListUtils.cs
- BamlCollectionHolder.cs
- MediaElementAutomationPeer.cs
- Random.cs
- DeclarationUpdate.cs
- SessionViewState.cs
- WebControlsSection.cs
- LinearKeyFrames.cs
- SchemaInfo.cs
- FixedNode.cs
- SystemFonts.cs
- ImageMetadata.cs
- SubMenuStyleCollection.cs
- ResourceManager.cs
- X509SubjectKeyIdentifierClause.cs
- EqualityArray.cs
- LogicalTreeHelper.cs
- CodeGroup.cs
- ResourceReferenceExpressionConverter.cs
- ViewService.cs
- BaseValidator.cs
- PenContexts.cs
- JobStaple.cs
- StaticContext.cs
- XmlQuerySequence.cs
- SqlUdtInfo.cs
- TransformedBitmap.cs
- SqlConnectionPoolProviderInfo.cs
- SmiConnection.cs
- AmbientEnvironment.cs
- DataKey.cs
- SwitchAttribute.cs
- PublisherIdentityPermission.cs
- loginstatus.cs
- CheckPair.cs
- WebBrowserUriTypeConverter.cs
- DataGridPagingPage.cs
- ComplexPropertyEntry.cs
- ListMarkerLine.cs
- HtmlInputRadioButton.cs
- Mutex.cs
- BaseDataListDesigner.cs
- PointHitTestResult.cs
- Serializer.cs
- ToolStripItemTextRenderEventArgs.cs
- EventKeyword.cs
- SqlConnectionHelper.cs
- GlyphRunDrawing.cs
- IntegerValidator.cs
- InternalControlCollection.cs
- JournalEntryListConverter.cs
- ScrollPattern.cs
- SourceFileBuildProvider.cs
- EmbossBitmapEffect.cs
- SrgsSubset.cs
- XmlSchemaComplexType.cs
- SqlDataSourceSelectingEventArgs.cs
- CqlWriter.cs
- HttpModuleAction.cs
- TabItemAutomationPeer.cs
- ObjectPropertyMapping.cs
- TreeView.cs
- cryptoapiTransform.cs
- PackWebRequestFactory.cs
- SchemaAttDef.cs
- WebPartDeleteVerb.cs
- WindowsRebar.cs
- EntityViewGenerationAttribute.cs
- ConfigurationPropertyAttribute.cs
- Point4D.cs
- IntSecurity.cs
- CFStream.cs
- BoundPropertyEntry.cs
- UndirectedGraph.cs
- ParserExtension.cs
- SchemaTableColumn.cs
- DoubleLinkList.cs
- OdbcPermission.cs
- DataControlField.cs
- ProcessInputEventArgs.cs
- CodeAccessSecurityEngine.cs
- IApplicationTrustManager.cs
- HandleDictionary.cs
- EntitySqlQueryCacheKey.cs
- Ref.cs