/// <inheritdoc /> public override bool TryTranslate(ODataTemplateTranslateContext context) { if (context == null) { throw Error.ArgumentNull(nameof(context)); } RouteValueDictionary routeValues = context.RouteValues; // the request should have the navigation property if (!routeValues.TryGetValue(ParameterName, out object rawValue)) { return(false); } string navigationProperty = rawValue as string; if (navigationProperty == null) { return(false); } // Find the navigation property IEdmNavigationProperty edmNavProperty = DeclaringType.ResolveProperty(navigationProperty) as IEdmNavigationProperty; if (edmNavProperty == null) { return(false); } IEdmNavigationSource targetNavigationSource = NavigationSource.FindNavigationTarget(edmNavProperty); // ODL implementation is complex, here i just use the NavigationPropertyLinkSegment context.Segments.Add(new NavigationPropertyLinkSegment(edmNavProperty, targetNavigationSource)); if (RelatedKey != null) { IEdmEntityType entityType = edmNavProperty.ToEntityType(); // only handle the single key IEdmStructuralProperty keyProperty = entityType.Key().SingleOrDefault(); Contract.Assert(entityType.Key().Count() == 1); Contract.Assert(keyProperty != null); IDictionary <string, string> keyValuePairs = new Dictionary <string, string> { { keyProperty.Name, $"{{{RelatedKey}}}" } }; KeySegmentTemplate keySegment = new KeySegmentTemplate(keyValuePairs, entityType, targetNavigationSource); return(keySegment.TryTranslate(context)); } return(true); }