/// <summary> /// Append the key segment in the end of ODataPath, the method does not modify current ODataPath instance, /// it returns a new ODataPath without ending type segment. /// If last segment is type cast, the key would be appended before type cast segment. /// </summary> /// <param name="path">Path to perform the computation on.</param> /// <param name="keys">The set of key property names and the values to be used in searching for the given item.</param> /// <param name="edmType">The type of the item this key returns.</param> /// <param name="navigationSource">The navigation source that this key is used to search.</param> /// <returns>The ODataPath with key segment appended</returns> public static ODataPath AppendKeySegment(this ODataPath path, IEnumerable <KeyValuePair <string, object> > keys, IEdmEntityType edmType, IEdmNavigationSource navigationSource) { var handler = new SplitEndingSegmentOfTypeHandler <TypeSegment>(); path.WalkWith(handler); KeySegment keySegment = new KeySegment(keys, edmType, navigationSource); ODataPath newPath = handler.FirstPart; newPath.Add(keySegment); foreach (var segment in handler.LastPart) { newPath.Add(segment); } return(newPath); }
/// <summary> /// Build a segment representing a navigation property. /// </summary> /// <param name="path">Path to perform the computation on.</param> /// <param name="navigationProperty">The navigation property this segment represents.</param> /// <param name="navigationSource">The navigation source of the entities targetted by this navigation property. This can be null.</param> /// <returns>The ODataPath with navigation property appended in the end in the end</returns> public static ODataPath AppendNavigationPropertySegment(this ODataPath path, IEdmNavigationProperty navigationProperty, IEdmNavigationSource navigationSource) { var newPath = new ODataPath(path); NavigationPropertySegment np = new NavigationPropertySegment(navigationProperty, navigationSource); newPath.Add(np); return(newPath); }
/// <summary> /// Remove the key segment in the end of ODataPath, the method does not modify current ODataPath instance, /// it returns a new ODataPath without ending type segment. /// If last segment is type cast, the key before type cast segment would be removed. /// </summary> /// <param name="path">Path to perform the computation on.</param> /// <returns>The ODataPath without key segment removed</returns> public static ODataPath TrimEndingKeySegment(this ODataPath path) { var typeHandler = new SplitEndingSegmentOfTypeHandler <TypeSegment>(); var keyHandler = new SplitEndingSegmentOfTypeHandler <KeySegment>(); path.WalkWith(typeHandler); typeHandler.FirstPart.WalkWith(keyHandler); ODataPath newPath = keyHandler.FirstPart; foreach (var segment in typeHandler.LastPart) { newPath.Add(segment); } return(newPath); }