Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SHA384Cng.cs
- JumpItem.cs
- MobileControl.cs
- WCFServiceClientProxyGenerator.cs
- Crc32.cs
- SqlVisitor.cs
- DefaultConfirmation.cs
- CryptoApi.cs
- RadioButtonList.cs
- SecurityContext.cs
- EqualityComparer.cs
- SessionEndingEventArgs.cs
- ExpressionBuilderContext.cs
- BidPrivateBase.cs
- OracleInfoMessageEventArgs.cs
- Variant.cs
- XPathNodePointer.cs
- WSHttpBinding.cs
- RuntimeWrappedException.cs
- CompensationToken.cs
- BackgroundWorker.cs
- VisualTreeUtils.cs
- SemaphoreFullException.cs
- StackBuilderSink.cs
- IgnorePropertiesAttribute.cs
- ConstantCheck.cs
- Queue.cs
- InputLanguageProfileNotifySink.cs
- Clock.cs
- SqlComparer.cs
- DrawingVisual.cs
- FontFamilyValueSerializer.cs
- XmlSchemaSubstitutionGroup.cs
- MatrixValueSerializer.cs
- EventProviderTraceListener.cs
- FormatterServices.cs
- WarningException.cs
- NativeObjectSecurity.cs
- CheckStoreFileValidityRequest.cs
- PathNode.cs
- TableLayoutPanelBehavior.cs
- SafeReversePInvokeHandle.cs
- Compiler.cs
- AutoGeneratedFieldProperties.cs
- ImageMap.cs
- TextFormatter.cs
- XmlSchemaRedefine.cs
- StringCollection.cs
- SqlGatherProducedAliases.cs
- EventLogReader.cs
- ToolbarAUtomationPeer.cs
- HostingEnvironment.cs
- Parallel.cs
- AutoGeneratedField.cs
- BasicExpressionVisitor.cs
- Clipboard.cs
- CodeGeneratorAttribute.cs
- HierarchicalDataBoundControlAdapter.cs
- ManagementObject.cs
- BorderSidesEditor.cs
- NullableFloatAverageAggregationOperator.cs
- NavigatingCancelEventArgs.cs
- HMACSHA384.cs
- ColorConverter.cs
- FontStretch.cs
- ContentAlignmentEditor.cs
- ConsumerConnectionPoint.cs
- OleCmdHelper.cs
- RawStylusInputReport.cs
- TraceUtils.cs
- EnvironmentPermission.cs
- IisTraceListener.cs
- NetMsmqSecurity.cs
- StackBuilderSink.cs
- DeviceContext2.cs
- RegexRunnerFactory.cs
- SqlCacheDependency.cs
- TextProperties.cs
- FormParameter.cs
- ControlParameter.cs
- MethodExpr.cs
- DataGridViewCellFormattingEventArgs.cs
- InvalidChannelBindingException.cs
- NavigationProperty.cs
- IdnMapping.cs
- PreservationFileWriter.cs
- ClientBuildManager.cs
- SByteConverter.cs
- Buffer.cs
- MimeTypePropertyAttribute.cs
- SingleKeyFrameCollection.cs
- ErrorTableItemStyle.cs
- MonitoringDescriptionAttribute.cs
- UnsafeNativeMethods.cs
- MarshalByValueComponent.cs
- Calendar.cs
- CreateUserWizardDesigner.cs
- SrgsToken.cs
- ApplicationFileParser.cs
- DoubleLink.cs