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
- StylusEditingBehavior.cs
- ComponentEvent.cs
- Group.cs
- Transform3D.cs
- SoapAttributes.cs
- ThemeInfoAttribute.cs
- ObjectItemAttributeAssemblyLoader.cs
- Win32Exception.cs
- StringFreezingAttribute.cs
- MatrixConverter.cs
- ModelEditingScope.cs
- FixUpCollection.cs
- Vector.cs
- InputReferenceExpression.cs
- LowerCaseStringConverter.cs
- TextLineBreak.cs
- SearchExpression.cs
- TablePattern.cs
- SqlBulkCopyColumnMappingCollection.cs
- DbProviderFactories.cs
- XmlQueryOutput.cs
- SyntaxCheck.cs
- Int16.cs
- errorpatternmatcher.cs
- HostedElements.cs
- WebControlAdapter.cs
- Crc32Helper.cs
- COM2Properties.cs
- TextSearch.cs
- DataKey.cs
- FloaterBaseParaClient.cs
- BasicCellRelation.cs
- XmlCustomFormatter.cs
- MemberRelationshipService.cs
- EdmSchemaError.cs
- SqlConnectionFactory.cs
- Renderer.cs
- XmlComplianceUtil.cs
- WebControl.cs
- StreamInfo.cs
- PropertyTabAttribute.cs
- BoundPropertyEntry.cs
- WebPartsPersonalization.cs
- XmlStringTable.cs
- ThicknessAnimation.cs
- HttpConfigurationSystem.cs
- EventPrivateKey.cs
- XNameConverter.cs
- ModelUIElement3D.cs
- Util.cs
- TraceContextRecord.cs
- HttpListenerResponse.cs
- TemplateManager.cs
- WebPartDeleteVerb.cs
- ControlParameter.cs
- TrackingQueryElement.cs
- TdsRecordBufferSetter.cs
- TextWriterTraceListener.cs
- PatternMatcher.cs
- Enum.cs
- ServicePerformanceCounters.cs
- MeshGeometry3D.cs
- ArraySortHelper.cs
- AdjustableArrowCap.cs
- XmlDataSourceView.cs
- OdbcEnvironment.cs
- GradientBrush.cs
- Size.cs
- SamlConstants.cs
- AspNetCacheProfileAttribute.cs
- PrtCap_Public_Simple.cs
- RealizationDrawingContextWalker.cs
- FrameworkName.cs
- RowToParametersTransformer.cs
- metadatamappinghashervisitor.cs
- Literal.cs
- InvalidPropValue.cs
- ConnectionStringsSection.cs
- SqlCacheDependency.cs
- ThicknessAnimation.cs
- SingleConverter.cs
- GridViewUpdateEventArgs.cs
- XmlSchemaObjectCollection.cs
- ellipse.cs
- CategoriesDocument.cs
- SerializationAttributes.cs
- TableCellAutomationPeer.cs
- ChangesetResponse.cs
- DataViewSettingCollection.cs
- LayoutDump.cs
- Font.cs
- TextEndOfParagraph.cs
- Timer.cs
- PropertyDescriptor.cs
- Accessible.cs
- RelationshipWrapper.cs
- SafeMILHandle.cs
- SrgsSubset.cs
- SqlDataSourceFilteringEventArgs.cs
- TextElementEnumerator.cs