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
- AdRotator.cs
- Enum.cs
- HtmlHistory.cs
- TerminatorSinks.cs
- Query.cs
- GlyphRun.cs
- CacheVirtualItemsEvent.cs
- Bezier.cs
- TypeReference.cs
- LinearQuaternionKeyFrame.cs
- TriggerCollection.cs
- BinarySerializer.cs
- GeometryModel3D.cs
- ApplicationSecurityManager.cs
- PublisherMembershipCondition.cs
- DataGridViewCellStyleChangedEventArgs.cs
- WindowsStatusBar.cs
- TemplateXamlTreeBuilder.cs
- PreviewPageInfo.cs
- AdjustableArrowCap.cs
- RowToFieldTransformer.cs
- ConfigXmlWhitespace.cs
- GeneralTransform3DCollection.cs
- validationstate.cs
- AnnotationService.cs
- RangeBaseAutomationPeer.cs
- VerificationAttribute.cs
- ObjectPersistData.cs
- DataException.cs
- HttpListenerContext.cs
- RelationshipEndCollection.cs
- Point.cs
- ConfigurationLocation.cs
- __ConsoleStream.cs
- DataExpression.cs
- PreservationFileWriter.cs
- SemanticResolver.cs
- SecurityAttributeGenerationHelper.cs
- SchemaObjectWriter.cs
- Exception.cs
- IntAverageAggregationOperator.cs
- ItemCheckedEvent.cs
- Timer.cs
- ParseChildrenAsPropertiesAttribute.cs
- CoreSwitches.cs
- LongMinMaxAggregationOperator.cs
- MemberDomainMap.cs
- AssemblyBuilderData.cs
- WebReferencesBuildProvider.cs
- AuthenticationConfig.cs
- HtmlTernaryTree.cs
- PropertyOverridesTypeEditor.cs
- GestureRecognizer.cs
- RuleRef.cs
- XmlNamespaceDeclarationsAttribute.cs
- XamlTemplateSerializer.cs
- DbModificationClause.cs
- SQLInt32.cs
- GeometryHitTestParameters.cs
- PointF.cs
- DataGridViewHitTestInfo.cs
- FocusManager.cs
- ReadingWritingEntityEventArgs.cs
- ReadOnlyDictionary.cs
- ActivationArguments.cs
- ModifierKeysValueSerializer.cs
- cache.cs
- UpDownBase.cs
- XmlSchemaSequence.cs
- RectangleConverter.cs
- SupportingTokenChannel.cs
- LineProperties.cs
- DiffuseMaterial.cs
- ThemeDictionaryExtension.cs
- FrameworkTextComposition.cs
- Models.cs
- IgnoreFlushAndCloseStream.cs
- HttpResponse.cs
- MarkupCompilePass1.cs
- SwitchElementsCollection.cs
- SamlDelegatingWriter.cs
- Int64.cs
- FontFamilyConverter.cs
- DynamicILGenerator.cs
- ApplicationSecurityInfo.cs
- EntryIndex.cs
- SqlCacheDependency.cs
- ControlCachePolicy.cs
- OleDbErrorCollection.cs
- KnownAssembliesSet.cs
- DbCommandTree.cs
- SetStoryboardSpeedRatio.cs
- DesignerTextBoxAdapter.cs
- XmlQueryType.cs
- RowBinding.cs
- XmlSchemaExternal.cs
- UriScheme.cs
- ConversionContext.cs
- TextEditorThreadLocalStore.cs
- TemplateControlCodeDomTreeGenerator.cs