Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataWeb / Client / System / Data / Services / Client / ALinq / PathBox.cs / 1305376 / PathBox.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] //--------------------------------------------------------------------- namespace System.Data.Services.Client { #region Namespaces. using System; using System.Text; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Linq; using System.Linq.Expressions; #endregion Namespaces. ////// Holds state (Path, lambda parameter stack, etc) for projection analysis. /// internal class PathBox { #region Private fields. ///This class is used as a marker for an entity projected in its entirety. private const char EntireEntityMarker = UriHelper.ASTERISK; private readonly ListprojectionPaths = new List (); private readonly List expandPaths = new List (); private readonly Stack parameterExpressions = new Stack (); private readonly Dictionary basePaths = new Dictionary (ReferenceEqualityComparer .Instance); #endregion Private fields. /// Initializes a new internal PathBox() { // add a default empty path. projectionPaths.Add(new StringBuilder()); } internal IEnumerableinstance. ProjectionPaths { get { return projectionPaths.Where(s => s.Length > 0).Select(s => s.ToString()).Distinct(); } } internal IEnumerable ExpandPaths { get { return expandPaths.Where(s => s.Length > 0).Select(s => s.ToString()).Distinct(); } } internal void PushParamExpression(ParameterExpression pe) { StringBuilder basePath = projectionPaths.Last(); basePaths.Add(pe, basePath.ToString()); projectionPaths.Remove(basePath); parameterExpressions.Push(pe); } internal void PopParamExpression() { parameterExpressions.Pop(); } internal ParameterExpression ParamExpressionInScope { get { Debug.Assert(parameterExpressions.Count > 0); return parameterExpressions.Peek(); } } /// Starts a new path. internal void StartNewPath() { Debug.Assert(this.ParamExpressionInScope != null, "this.ParamExpressionInScope != null -- should not be starting new path with no lambda parameter in scope."); StringBuilder sb = new StringBuilder(basePaths[this.ParamExpressionInScope]); RemoveEntireEntityMarkerIfPresent(sb); expandPaths.Add(new StringBuilder(sb.ToString())); AddEntireEntityMarker(sb); projectionPaths.Add(sb); } internal void AppendToPath(PropertyInfo pi) { Debug.Assert(pi != null, "pi != null"); StringBuilder sb; Type t = TypeSystem.GetElementType(pi.PropertyType); if (ClientType.CheckElementTypeIsEntity(t)) { // an entity, so need to append to expand path also sb = expandPaths.Last(); Debug.Assert(sb != null); // there should always be an expand path because must call StartNewPath first. if (sb.Length > 0) { sb.Append(UriHelper.FORWARDSLASH); } sb.Append(pi.Name); } sb = projectionPaths.Last(); Debug.Assert(sb != null, "sb != null -- we are always building paths in the context of a parameter"); RemoveEntireEntityMarkerIfPresent(sb); if (sb.Length > 0) { sb.Append(UriHelper.FORWARDSLASH); } sb.Append(pi.Name); if (ClientType.CheckElementTypeIsEntity(t)) { AddEntireEntityMarker(sb); } } private static void RemoveEntireEntityMarkerIfPresent(StringBuilder sb) { if (sb.Length > 0 && sb[sb.Length - 1] == EntireEntityMarker) { sb.Remove(sb.Length - 1, 1); } if (sb.Length > 0 && sb[sb.Length - 1] == UriHelper.FORWARDSLASH) { sb.Remove(sb.Length - 1, 1); } } private static void AddEntireEntityMarker(StringBuilder sb) { if (sb.Length > 0) { sb.Append(UriHelper.FORWARDSLASH); } sb.Append(EntireEntityMarker); } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] //--------------------------------------------------------------------- namespace System.Data.Services.Client { #region Namespaces. using System; using System.Text; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Linq; using System.Linq.Expressions; #endregion Namespaces. ////// Holds state (Path, lambda parameter stack, etc) for projection analysis. /// internal class PathBox { #region Private fields. ///This class is used as a marker for an entity projected in its entirety. private const char EntireEntityMarker = UriHelper.ASTERISK; private readonly ListprojectionPaths = new List (); private readonly List expandPaths = new List (); private readonly Stack parameterExpressions = new Stack (); private readonly Dictionary basePaths = new Dictionary (ReferenceEqualityComparer .Instance); #endregion Private fields. /// Initializes a new internal PathBox() { // add a default empty path. projectionPaths.Add(new StringBuilder()); } internal IEnumerableinstance. ProjectionPaths { get { return projectionPaths.Where(s => s.Length > 0).Select(s => s.ToString()).Distinct(); } } internal IEnumerable ExpandPaths { get { return expandPaths.Where(s => s.Length > 0).Select(s => s.ToString()).Distinct(); } } internal void PushParamExpression(ParameterExpression pe) { StringBuilder basePath = projectionPaths.Last(); basePaths.Add(pe, basePath.ToString()); projectionPaths.Remove(basePath); parameterExpressions.Push(pe); } internal void PopParamExpression() { parameterExpressions.Pop(); } internal ParameterExpression ParamExpressionInScope { get { Debug.Assert(parameterExpressions.Count > 0); return parameterExpressions.Peek(); } } /// Starts a new path. internal void StartNewPath() { Debug.Assert(this.ParamExpressionInScope != null, "this.ParamExpressionInScope != null -- should not be starting new path with no lambda parameter in scope."); StringBuilder sb = new StringBuilder(basePaths[this.ParamExpressionInScope]); RemoveEntireEntityMarkerIfPresent(sb); expandPaths.Add(new StringBuilder(sb.ToString())); AddEntireEntityMarker(sb); projectionPaths.Add(sb); } internal void AppendToPath(PropertyInfo pi) { Debug.Assert(pi != null, "pi != null"); StringBuilder sb; Type t = TypeSystem.GetElementType(pi.PropertyType); if (ClientType.CheckElementTypeIsEntity(t)) { // an entity, so need to append to expand path also sb = expandPaths.Last(); Debug.Assert(sb != null); // there should always be an expand path because must call StartNewPath first. if (sb.Length > 0) { sb.Append(UriHelper.FORWARDSLASH); } sb.Append(pi.Name); } sb = projectionPaths.Last(); Debug.Assert(sb != null, "sb != null -- we are always building paths in the context of a parameter"); RemoveEntireEntityMarkerIfPresent(sb); if (sb.Length > 0) { sb.Append(UriHelper.FORWARDSLASH); } sb.Append(pi.Name); if (ClientType.CheckElementTypeIsEntity(t)) { AddEntireEntityMarker(sb); } } private static void RemoveEntireEntityMarkerIfPresent(StringBuilder sb) { if (sb.Length > 0 && sb[sb.Length - 1] == EntireEntityMarker) { sb.Remove(sb.Length - 1, 1); } if (sb.Length > 0 && sb[sb.Length - 1] == UriHelper.FORWARDSLASH) { sb.Remove(sb.Length - 1, 1); } } private static void AddEntireEntityMarker(StringBuilder sb) { if (sb.Length > 0) { sb.Append(UriHelper.FORWARDSLASH); } sb.Append(EntireEntityMarker); } } } // 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
- OdbcHandle.cs
- PrintingPermission.cs
- InheritanceContextHelper.cs
- PerformanceCountersElement.cs
- MobileControlPersister.cs
- EnvironmentPermission.cs
- WebUtility.cs
- SmtpNegotiateAuthenticationModule.cs
- RootProfilePropertySettingsCollection.cs
- XmlSchemaParticle.cs
- RoleServiceManager.cs
- HttpPostedFileWrapper.cs
- SQLDateTime.cs
- StructuralComparisons.cs
- Decimal.cs
- DataGridViewRowCancelEventArgs.cs
- RichTextBoxAutomationPeer.cs
- DbMetaDataCollectionNames.cs
- Point3DAnimationBase.cs
- CommandField.cs
- ContainerUIElement3D.cs
- UnsafeNativeMethodsTablet.cs
- ProgressiveCrcCalculatingStream.cs
- ConfigurationProperty.cs
- _TransmitFileOverlappedAsyncResult.cs
- WindowClosedEventArgs.cs
- VirtualPath.cs
- NativeRecognizer.cs
- WindowsGrip.cs
- DateTimeConstantAttribute.cs
- InvalidFilterCriteriaException.cs
- __TransparentProxy.cs
- SafeEventLogReadHandle.cs
- XPathAxisIterator.cs
- MetadataArtifactLoaderCompositeResource.cs
- SQLInt16.cs
- PartialCachingControl.cs
- ConnectionStringSettingsCollection.cs
- PassportAuthentication.cs
- BitmapDecoder.cs
- RectangleHotSpot.cs
- ButtonFlatAdapter.cs
- XamlReader.cs
- SourceItem.cs
- DbDataRecord.cs
- TcpTransportSecurity.cs
- ServiceBusyException.cs
- XmlChildNodes.cs
- NamedObject.cs
- RowsCopiedEventArgs.cs
- DelegatingTypeDescriptionProvider.cs
- NavigationHelper.cs
- SmuggledIUnknown.cs
- ResourceWriter.cs
- CircleHotSpot.cs
- MiniAssembly.cs
- InvalidOperationException.cs
- ComplexPropertyEntry.cs
- ExpressionPrefixAttribute.cs
- JpegBitmapDecoder.cs
- CommandField.cs
- ThreadAttributes.cs
- UInt64Converter.cs
- XmlComment.cs
- ResolveCriteria.cs
- ExtractedStateEntry.cs
- SafeBitVector32.cs
- VSWCFServiceContractGenerator.cs
- TdsParserHelperClasses.cs
- MetadataArtifactLoader.cs
- CompilationSection.cs
- InternalMappingException.cs
- Crypto.cs
- IndexedString.cs
- MergeLocalizationDirectives.cs
- AmbiguousMatchException.cs
- ToolStripItemRenderEventArgs.cs
- AdornerLayer.cs
- XmlSerializationWriter.cs
- SymDocumentType.cs
- UInt64Storage.cs
- ItemCheckEvent.cs
- path.cs
- ViewSimplifier.cs
- MethodBuilderInstantiation.cs
- Utils.cs
- ScrollPattern.cs
- SqlNodeAnnotation.cs
- XhtmlBasicObjectListAdapter.cs
- Module.cs
- DataGridState.cs
- DayRenderEvent.cs
- AlphabetConverter.cs
- ControlPropertyNameConverter.cs
- ValueTable.cs
- TransformValueSerializer.cs
- Parallel.cs
- Track.cs
- AdapterDictionary.cs
- ObjectResult.cs