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
- PropertyChangeTracker.cs
- SqlCacheDependency.cs
- DataColumn.cs
- RegisteredArrayDeclaration.cs
- CompiledIdentityConstraint.cs
- FontEmbeddingManager.cs
- RequestCacheEntry.cs
- UIntPtr.cs
- SuppressMergeCheckAttribute.cs
- CodeMemberEvent.cs
- TextDecoration.cs
- TextServicesContext.cs
- HScrollBar.cs
- GenericIdentity.cs
- Relationship.cs
- DataRowChangeEvent.cs
- XmlSchemaSimpleContentRestriction.cs
- ColorAnimationBase.cs
- ZoneMembershipCondition.cs
- BufferedStream.cs
- Activator.cs
- SchemaImporterExtensionElement.cs
- ListBoxItemAutomationPeer.cs
- SqlTriggerAttribute.cs
- TreeViewItem.cs
- TypeResolver.cs
- ObjectTypeMapping.cs
- figurelength.cs
- ScrollContentPresenter.cs
- CustomErrorCollection.cs
- PrintingPermissionAttribute.cs
- MaskedTextBoxTextEditor.cs
- Vector.cs
- OracleLob.cs
- ToolStripDropTargetManager.cs
- NullableLongSumAggregationOperator.cs
- XmlNodeReader.cs
- XmlCharacterData.cs
- HtmlForm.cs
- CacheMemory.cs
- DocumentOrderQuery.cs
- RelationshipConverter.cs
- IntSecurity.cs
- RectValueSerializer.cs
- WindowsScroll.cs
- FullTextState.cs
- CommandBinding.cs
- UrlMappingsModule.cs
- Identifier.cs
- DisplayMemberTemplateSelector.cs
- Error.cs
- fixedPageContentExtractor.cs
- CodeNamespaceCollection.cs
- WebPartVerb.cs
- ApplicationServiceManager.cs
- CodeDirectoryCompiler.cs
- GridViewUpdatedEventArgs.cs
- MembershipValidatePasswordEventArgs.cs
- DataGridViewRowHeaderCell.cs
- Main.cs
- COM2Properties.cs
- FormatterServices.cs
- DomainConstraint.cs
- TypeUtil.cs
- Timer.cs
- BinaryObjectInfo.cs
- CellLabel.cs
- FixUp.cs
- ConditionalExpression.cs
- HostedNamedPipeTransportManager.cs
- SQLMoney.cs
- IncomingWebResponseContext.cs
- SessionEndingCancelEventArgs.cs
- RegexCharClass.cs
- ConfigXmlElement.cs
- IdnElement.cs
- WebPartAddingEventArgs.cs
- ImmutableClientRuntime.cs
- OdbcRowUpdatingEvent.cs
- ExceptionHelpers.cs
- ResponseStream.cs
- DesigntimeLicenseContextSerializer.cs
- TextEditorSpelling.cs
- XPathBinder.cs
- isolationinterop.cs
- ExpandedWrapper.cs
- EventToken.cs
- ResourcesBuildProvider.cs
- TemplateParser.cs
- Rectangle.cs
- DesignerAdapterUtil.cs
- PageMediaSize.cs
- BasicCellRelation.cs
- CompModSwitches.cs
- PageWrapper.cs
- OracleParameter.cs
- PrePrepareMethodAttribute.cs
- SystemColors.cs
- QueryExtender.cs
- EdgeProfileValidation.cs