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
- StaticDataManager.cs
- _Connection.cs
- LinkClickEvent.cs
- peersecuritysettings.cs
- ParamArrayAttribute.cs
- EditorZone.cs
- InstanceDataCollection.cs
- ImageMetadata.cs
- BufferModeSettings.cs
- WmlObjectListAdapter.cs
- ISessionStateStore.cs
- TemplatePartAttribute.cs
- RequestCachePolicyConverter.cs
- WindowCollection.cs
- AnimationException.cs
- MultipartContentParser.cs
- CodeIndexerExpression.cs
- BufferedGraphicsManager.cs
- DataRelationCollection.cs
- SqlDataSourceCommandEventArgs.cs
- MeasurementDCInfo.cs
- isolationinterop.cs
- ValueProviderWrapper.cs
- SelectionItemProviderWrapper.cs
- AutoGeneratedFieldProperties.cs
- XmlChoiceIdentifierAttribute.cs
- InvariantComparer.cs
- ServicePointManager.cs
- RuntimeConfig.cs
- PresentationSource.cs
- MethodCallConverter.cs
- Camera.cs
- AsyncPostBackErrorEventArgs.cs
- WindowsAuthenticationModule.cs
- RealizationContext.cs
- SQLInt64Storage.cs
- PersonalizationStateInfo.cs
- DnsPermission.cs
- PersonalizationEntry.cs
- DesignerActionVerbList.cs
- CoTaskMemHandle.cs
- RoutedEvent.cs
- ConstraintConverter.cs
- ImageSource.cs
- WindowsClaimSet.cs
- Drawing.cs
- Executor.cs
- ActivityDesignerHelper.cs
- SerialStream.cs
- GridViewRowPresenterBase.cs
- KeyboardEventArgs.cs
- QueryCacheKey.cs
- datacache.cs
- StrokeNodeOperations2.cs
- ObjectDataProvider.cs
- ReachSerializationCacheItems.cs
- CombinedTcpChannel.cs
- Localizer.cs
- StateMachineHistory.cs
- DBDataPermission.cs
- HashLookup.cs
- DataColumnMapping.cs
- IIS7UserPrincipal.cs
- Font.cs
- UriTemplateQueryValue.cs
- HyperLinkDesigner.cs
- DropDownList.cs
- MetabaseSettings.cs
- _ConnectionGroup.cs
- StringBuilder.cs
- SynchronizationLockException.cs
- AuthorizationRuleCollection.cs
- StandardCommands.cs
- AnnotationComponentChooser.cs
- PromptEventArgs.cs
- Symbol.cs
- Stroke2.cs
- SiteMap.cs
- Package.cs
- MetadataUtil.cs
- Baml2006ReaderSettings.cs
- CodeNamespaceImport.cs
- SiteMapHierarchicalDataSourceView.cs
- smtpconnection.cs
- nulltextcontainer.cs
- WpfKnownMember.cs
- updateconfighost.cs
- AccessText.cs
- RichTextBox.cs
- TaskFileService.cs
- XNodeValidator.cs
- JoinCqlBlock.cs
- safesecurityhelperavalon.cs
- PanelDesigner.cs
- ApplicationHost.cs
- StronglyTypedResourceBuilder.cs
- TextSchema.cs
- HtmlContainerControl.cs
- WeakRefEnumerator.cs
- ImportedNamespaceContextItem.cs