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
- BaseTemplateBuildProvider.cs
- AsmxEndpointPickerExtension.cs
- AuthenticationModuleElement.cs
- ContentDefinition.cs
- ReverseInheritProperty.cs
- ResizeBehavior.cs
- CultureTable.cs
- SafeViewOfFileHandle.cs
- XmlSchemaElement.cs
- ImageDrawing.cs
- ListenUriMode.cs
- SessionPageStateSection.cs
- Animatable.cs
- ReachDocumentReferenceCollectionSerializer.cs
- AttributeTableBuilder.cs
- GridViewColumnCollection.cs
- TrustManager.cs
- StrongName.cs
- RenderData.cs
- HttpCacheParams.cs
- ISCIIEncoding.cs
- NativeMethods.cs
- CryptoStream.cs
- RegistrationServices.cs
- FixedTextBuilder.cs
- ValidatorUtils.cs
- CachedBitmap.cs
- HashCodeCombiner.cs
- WasHttpModulesInstallComponent.cs
- StdValidatorsAndConverters.cs
- XPathNavigatorKeyComparer.cs
- QilDataSource.cs
- HostingEnvironmentException.cs
- ComplexLine.cs
- ImageMapEventArgs.cs
- ClaimTypeElementCollection.cs
- WindowsAuthenticationEventArgs.cs
- BindingOperations.cs
- GroupStyle.cs
- DocumentGridContextMenu.cs
- PanelStyle.cs
- DynamicPropertyHolder.cs
- DesignerOptionService.cs
- DataStorage.cs
- loginstatus.cs
- WebServiceMethodData.cs
- ProtectedConfiguration.cs
- EmissiveMaterial.cs
- Ops.cs
- HtmlAnchor.cs
- OracleCommandSet.cs
- BookmarkEventArgs.cs
- ManagementObjectSearcher.cs
- ObjectParameterCollection.cs
- ArrayTypeMismatchException.cs
- CodeAttachEventStatement.cs
- Polyline.cs
- InstalledFontCollection.cs
- Section.cs
- DataTable.cs
- TemplateLookupAction.cs
- JulianCalendar.cs
- DataGridViewHeaderCell.cs
- WsdlBuildProvider.cs
- LostFocusEventManager.cs
- ErrorHandlerModule.cs
- WebPartEditorApplyVerb.cs
- UserControl.cs
- DependencyPropertyKind.cs
- EdgeModeValidation.cs
- CodeMemberEvent.cs
- Collection.cs
- ReflectionPermission.cs
- XamlFilter.cs
- If.cs
- Int16Converter.cs
- RouteParameter.cs
- UserControl.cs
- Double.cs
- ChtmlMobileTextWriter.cs
- ResourceContainer.cs
- GraphicsPath.cs
- OleDbConnectionInternal.cs
- HostingEnvironmentWrapper.cs
- FormsAuthenticationTicket.cs
- ObjectKeyFrameCollection.cs
- cookie.cs
- DoubleAnimationClockResource.cs
- XmlReflectionMember.cs
- SingleAnimation.cs
- AttachedPropertyBrowsableAttribute.cs
- Transactions.cs
- RowToParametersTransformer.cs
- DataControlHelper.cs
- WindowsRebar.cs
- DllNotFoundException.cs
- DataFormats.cs
- TableDesigner.cs
- StrongTypingException.cs
- FreeFormDragDropManager.cs