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
- ExceptionHandlerDesigner.cs
- SettingsSavedEventArgs.cs
- DeflateStream.cs
- BoundsDrawingContextWalker.cs
- SqlXmlStorage.cs
- DetailsViewCommandEventArgs.cs
- DrawingImage.cs
- TemplateParser.cs
- CodeConditionStatement.cs
- updateconfighost.cs
- ObjectAssociationEndMapping.cs
- Label.cs
- ContractBase.cs
- SingleSelectRootGridEntry.cs
- ICollection.cs
- SendReply.cs
- StringDictionary.cs
- OleDbCommandBuilder.cs
- SchemaImporterExtensionsSection.cs
- ITreeGenerator.cs
- TreeNodeCollectionEditorDialog.cs
- RestHandlerFactory.cs
- ObjectQueryProvider.cs
- KoreanLunisolarCalendar.cs
- PagedDataSource.cs
- StructuralObject.cs
- Geometry.cs
- SoundPlayer.cs
- SqlDuplicator.cs
- MimeXmlImporter.cs
- ListViewItemMouseHoverEvent.cs
- FontFamilyIdentifier.cs
- Expression.DebuggerProxy.cs
- PrePrepareMethodAttribute.cs
- StreamResourceInfo.cs
- SelectionService.cs
- DelegateSerializationHolder.cs
- StatusBarPanel.cs
- TabControl.cs
- AutoResizedEvent.cs
- MouseButtonEventArgs.cs
- TaskHelper.cs
- HandlerBase.cs
- BindingExpressionBase.cs
- DefaultTraceListener.cs
- DispatcherTimer.cs
- ParsedAttributeCollection.cs
- EdgeModeValidation.cs
- GenericsInstances.cs
- _BufferOffsetSize.cs
- DataBindingCollection.cs
- AssemblyAttributesGoHere.cs
- FindProgressChangedEventArgs.cs
- ContourSegment.cs
- TableRow.cs
- VideoDrawing.cs
- SplitContainerDesigner.cs
- AdapterUtil.cs
- ListParaClient.cs
- SchemaInfo.cs
- ItemDragEvent.cs
- Dictionary.cs
- ActivityExecutionContext.cs
- CacheForPrimitiveTypes.cs
- DoubleLinkListEnumerator.cs
- LineServices.cs
- EmptyControlCollection.cs
- WpfKnownMember.cs
- WebEventCodes.cs
- Wizard.cs
- FieldDescriptor.cs
- SettingsPropertyValueCollection.cs
- MetadataItemCollectionFactory.cs
- SiteMapSection.cs
- Vector3DAnimation.cs
- IQueryable.cs
- CachingParameterInspector.cs
- ConnectionManagementElementCollection.cs
- DataTemplateSelector.cs
- WindowProviderWrapper.cs
- EntitySetDataBindingList.cs
- Query.cs
- RbTree.cs
- IdentityNotMappedException.cs
- EventLogEntry.cs
- FileRecordSequenceCompletedAsyncResult.cs
- ConfigXmlComment.cs
- Rect3D.cs
- DoubleKeyFrameCollection.cs
- Debug.cs
- HtmlInputPassword.cs
- Cursors.cs
- MarshalByValueComponent.cs
- XpsViewerException.cs
- TextParaLineResult.cs
- Restrictions.cs
- GeometryHitTestResult.cs
- ExecutionEngineException.cs
- ObjectIDGenerator.cs
- XslCompiledTransform.cs