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
- HandlerWithFactory.cs
- BaseResourcesBuildProvider.cs
- AmbiguousMatchException.cs
- _PooledStream.cs
- DbProviderFactory.cs
- TouchDevice.cs
- PointLightBase.cs
- VectorCollectionConverter.cs
- SHA512.cs
- SignatureGenerator.cs
- ProviderSettingsCollection.cs
- UrlUtility.cs
- ReadOnlyCollectionBase.cs
- RadialGradientBrush.cs
- HitTestDrawingContextWalker.cs
- ConnectionManagementElement.cs
- SizeIndependentAnimationStorage.cs
- StaticDataManager.cs
- EllipseGeometry.cs
- ValidationContext.cs
- PointConverter.cs
- PropertyChangingEventArgs.cs
- lengthconverter.cs
- ToolboxComponentsCreatedEventArgs.cs
- Util.cs
- SecurityElement.cs
- VectorConverter.cs
- SchemaElementDecl.cs
- ACE.cs
- TitleStyle.cs
- InstanceCreationEditor.cs
- CustomErrorsSection.cs
- MetadataArtifactLoaderXmlReaderWrapper.cs
- PersistChildrenAttribute.cs
- Oid.cs
- CodePageEncoding.cs
- TeredoHelper.cs
- RepeaterCommandEventArgs.cs
- DependencySource.cs
- WebAdminConfigurationHelper.cs
- ListSourceHelper.cs
- KoreanCalendar.cs
- SoapProtocolReflector.cs
- ValidatorCollection.cs
- Debug.cs
- CommunicationException.cs
- ClaimTypeRequirement.cs
- PropertyDescriptorCollection.cs
- FixedHighlight.cs
- HitTestDrawingContextWalker.cs
- listviewsubitemcollectioneditor.cs
- CaseInsensitiveOrdinalStringComparer.cs
- ZoneButton.cs
- OperationResponse.cs
- AssemblyNameEqualityComparer.cs
- ArrayConverter.cs
- securestring.cs
- KnownTypesProvider.cs
- ObjectContext.cs
- SimpleLine.cs
- Grant.cs
- PropertyGrid.cs
- graph.cs
- HMACSHA384.cs
- NativeMethodsCLR.cs
- OTFRasterizer.cs
- FileDialog_Vista_Interop.cs
- NaturalLanguageHyphenator.cs
- TreeView.cs
- ListViewSelectEventArgs.cs
- TransformGroup.cs
- BitmapCodecInfo.cs
- InitializeCorrelation.cs
- DBConnection.cs
- EnumBuilder.cs
- ProfileProvider.cs
- DataViewSetting.cs
- WeakEventTable.cs
- NullRuntimeConfig.cs
- StreamInfo.cs
- GroupBoxAutomationPeer.cs
- TerminatorSinks.cs
- TypeCodeDomSerializer.cs
- XmlSchemaCollection.cs
- ModelTreeManager.cs
- MatrixCamera.cs
- ProfileGroupSettingsCollection.cs
- GridView.cs
- ScaleTransform3D.cs
- PowerEase.cs
- SqlDelegatedTransaction.cs
- IPEndPoint.cs
- MatrixTransform3D.cs
- loginstatus.cs
- DataGridAddNewRow.cs
- EastAsianLunisolarCalendar.cs
- XNodeValidator.cs
- MatrixAnimationUsingPath.cs
- DataAdapter.cs
- FtpWebRequest.cs