/// <summary> /// Concatenates the given sequence of segment sets onto the given string builder /// </summary> /// <param name="converter">The uri to string converter to extend</param> /// <param name="builder">The string builder to append onto</param> /// <param name="segmentSets">The segment sets to append</param> public static void ConcatenateSegments(this IODataUriToStringConverter converter, StringBuilder builder, ODataUriSegmentPathCollection segmentSets) { ExceptionUtilities.CheckArgumentNotNull(converter, "converter"); ExceptionUtilities.CheckArgumentNotNull(builder, "builder"); ExceptionUtilities.CheckCollectionNotEmpty(segmentSets, "segmentSets"); bool isFirstSegmentSet = true; foreach (var segments in segmentSets) { if (!isFirstSegmentSet) { builder.Append(','); } isFirstSegmentSet = false; converter.ConcatenateSegments(builder, segments); } }
/// <summary> /// Concatenates the given sequence of segment sets into a comma and slash delimited string /// </summary> /// <param name="converter">The uri to string converter to extend</param> /// <param name="segmentSets">the segment sets to concatenate</param> /// <returns>the concatenated segment string</returns> public static string ConcatenateSegments(this IODataUriToStringConverter converter, ODataUriSegmentPathCollection segmentSets) { var builder = new StringBuilder(); converter.ConcatenateSegments(builder, segmentSets); return(builder.ToString()); }
/// <summary> /// Parses a collection of segment paths using the format expected for the '$expand' and '$select' query options /// </summary> /// <param name="type">The entity type the paths start from</param> /// <param name="toParse">The string to parse</param> /// <returns>The parsed collection of segment paths</returns> public static ODataUriSegmentPathCollection ParseSegmentPathCollection(EntityType type, string toParse) { ExceptionUtilities.CheckArgumentNotNull(toParse, "toParse"); ODataUriSegmentPathCollection segmentPathCollection = new ODataUriSegmentPathCollection(); foreach (string path in toParse.Trim().Split(',')) { IList <ODataUriSegment> segmentPath = new List <ODataUriSegment>(); IEnumerable <MemberProperty> possibleProperties = type.AllProperties; IEnumerable <NavigationProperty> possibleNavigations = type.AllNavigationProperties; foreach (string segment in path.Trim().Split('/')) { EntityType matchingType; if (TryGetEntityTypeInHierarchy(type, segment, out matchingType)) { segmentPath.Add(new EntityTypeSegment(matchingType)); continue; } MemberProperty property = null; if (possibleProperties != null) { property = possibleProperties.SingleOrDefault(p => p.Name == segment); } NavigationProperty navigation = null; if (possibleNavigations != null) { navigation = possibleNavigations.SingleOrDefault(p => p.Name == segment); } if (property == null && navigation == null) { possibleProperties = null; SystemSegment systemSegment; if (SystemSegment.TryGet(segment, out systemSegment)) { segmentPath.Add(systemSegment); } else { segmentPath.Add(new UnrecognizedSegment(segment)); } } else if (property != null) { possibleNavigations = null; ComplexDataType complexType = property.PropertyType as ComplexDataType; if (complexType != null) { possibleProperties = complexType.Definition.Properties; } else { possibleProperties = null; possibleNavigations = null; } segmentPath.Add(new PropertySegment(property)); } else { possibleProperties = navigation.ToAssociationEnd.EntityType.AllProperties; possibleNavigations = navigation.ToAssociationEnd.EntityType.AllNavigationProperties; segmentPath.Add(new NavigationSegment(navigation)); } } segmentPathCollection.Add(segmentPath); } return(segmentPathCollection); }