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
- ZoneMembershipCondition.cs
- DBPropSet.cs
- LineGeometry.cs
- FileChangesMonitor.cs
- CommonDialog.cs
- UpdateManifestForBrowserApplication.cs
- StringAttributeCollection.cs
- MouseGestureValueSerializer.cs
- NamespaceImport.cs
- DiscoveryDocumentLinksPattern.cs
- FileDialog_Vista_Interop.cs
- QilVisitor.cs
- RoutedEventValueSerializer.cs
- WindowHideOrCloseTracker.cs
- FlowLayout.cs
- SafeTokenHandle.cs
- TextServicesCompartment.cs
- MemberMaps.cs
- MimeMapping.cs
- Bitmap.cs
- HyperlinkAutomationPeer.cs
- DoubleLinkList.cs
- OdbcCommand.cs
- NavigationFailedEventArgs.cs
- ClientSideProviderDescription.cs
- LayoutEngine.cs
- COAUTHIDENTITY.cs
- ImportCatalogPart.cs
- NonParentingControl.cs
- ResourceManager.cs
- TextRangeEdit.cs
- XmlSchemaSimpleTypeUnion.cs
- COM2PictureConverter.cs
- DiagnosticsConfiguration.cs
- WindowsListViewGroupHelper.cs
- oledbmetadatacolumnnames.cs
- Literal.cs
- IndentTextWriter.cs
- FileSystemInfo.cs
- OracleEncoding.cs
- Win32Exception.cs
- SqlInternalConnection.cs
- StrongName.cs
- DesignBindingEditor.cs
- XDRSchema.cs
- SRef.cs
- Paragraph.cs
- GridViewItemAutomationPeer.cs
- ListViewDesigner.cs
- NativeMethods.cs
- DispatcherExceptionEventArgs.cs
- OleDbFactory.cs
- Cell.cs
- OdbcConnectionHandle.cs
- FileResponseElement.cs
- autovalidator.cs
- Wizard.cs
- EntryWrittenEventArgs.cs
- SiteMap.cs
- GenericEnumerator.cs
- CodeActivity.cs
- TypedOperationInfo.cs
- RuleSettingsCollection.cs
- PageParser.cs
- TextElementCollectionHelper.cs
- HtmlForm.cs
- PeerFlooder.cs
- ToolStripSystemRenderer.cs
- WebPartConnectionCollection.cs
- SuppressMessageAttribute.cs
- ResourceProperty.cs
- CodeValidator.cs
- RangeValidator.cs
- QilName.cs
- DataGridRowHeaderAutomationPeer.cs
- PhysicalAddress.cs
- SortKey.cs
- ProcessModuleCollection.cs
- TdsParserSessionPool.cs
- StringWriter.cs
- FormClosedEvent.cs
- Range.cs
- dbenumerator.cs
- DataPager.cs
- _UriTypeConverter.cs
- PolygonHotSpot.cs
- ExpandableObjectConverter.cs
- AccessibleObject.cs
- XmlSchemaComplexType.cs
- SpinLock.cs
- XmlBoundElement.cs
- DocumentApplicationJournalEntry.cs
- ExtensionFile.cs
- SerializerProvider.cs
- Validator.cs
- Adorner.cs
- FilterableAttribute.cs
- GeometryModel3D.cs
- DataSourceXmlClassAttribute.cs
- ButtonBaseDesigner.cs