/// <summary> /// Initializes a new instance of the <see cref="KeyValuePathSegmentTemplate"/> class. /// </summary> /// <param name="keyValueSegment">The key value segment to be parsed as a template.</param> public KeyValuePathSegmentTemplate(KeyValuePathSegment keyValueSegment) { if (keyValueSegment == null) { throw Error.ArgumentNull("keyValueSegment"); } ParameterMappings = BuildParameterMappings(keyValueSegment.Values, keyValueSegment.Value); }
private static IReadOnlyDictionary<string, object> GetPathKeyValues( KeyValuePathSegment keySegment, IEdmEntityType entityType) { var result = new Dictionary<string, object>(); var keys = entityType.Key(); // TODO GitHubIssue#42 : Improve key parsing logic // this parsing implementation does not allow key values to contain commas // Depending on the WebAPI to make KeyValuePathSegment.Values collection public // (or have the parsing logic public). string[] values = keySegment.Value.Split(EntityKeySeparator); if (values.Length > 1) { foreach (string value in values) { // Split key name and key value var keyValues = value.Split(EntityKeyNameValueSeparator); if (keyValues.Length != 2) { throw new InvalidOperationException(Resources.IncorrectKeyFormat); } // Validate the key name if (!keys.Select(k => k.Name).Contains(keyValues[0])) { throw new InvalidOperationException( string.Format( CultureInfo.InvariantCulture, Resources.KeyNotValidForEntityType, keyValues[0], entityType.Name)); } result.Add(keyValues[0], ODataUriUtils.ConvertFromUriLiteral(keyValues[1], ODataVersion.V4)); } } else { // We just have the single key value // Validate it has exactly one key if (keys.Count() > 1) { throw new InvalidOperationException(Resources.MultiKeyValuesExpected); } var keyName = keys.First().Name; result.Add(keyName, ODataUriUtils.ConvertFromUriLiteral(keySegment.Value, ODataVersion.V4)); } return result; }