/// <inheritdoc/> public override bool TryMatch(ODataPathSegment pathSegment, IDictionary <string, object> values) { OperationSegment other = pathSegment as OperationSegment; if (other == null) { return(false); } IEdmOperation operation = Segment.Operations.First(); IEdmOperation otherOperation = other.Operations.First(); if (operation.IsAction() && otherOperation.IsAction()) { return(operation == otherOperation); } else if (operation.IsFunction() && otherOperation.IsFunction()) { if (operation.FullName() != otherOperation.FullName()) { return(false); } IDictionary <string, object> parameterValues = new Dictionary <string, object>(); foreach (var parameter in other.Parameters) { object value = other.GetParameterValue(parameter.Name); parameterValues[parameter.Name] = value; } if (RoutingConventionHelpers.TryMatch(ParameterMappings, parameterValues, values)) { foreach (var operationSegmentParameter in other.Parameters) { string name = operationSegmentParameter.Name; object value = parameterValues[name]; RoutingConventionHelpers.AddFunctionParameters((IEdmFunction)otherOperation, name, value, values, values, ParameterMappings); } return(true); } } return(false); }
public static void AddFunctionParameterToRouteData(this IWebApiControllerContext controllerContext, OperationSegment functionSegment) { Contract.Assert(controllerContext != null); Contract.Assert(functionSegment != null); IDictionary <string, object> routingConventionsStore = controllerContext.Request.Context.RoutingConventionsStore; IEdmFunction function = functionSegment.Operations.First() as IEdmFunction; if (function == null) { return; } foreach (OperationSegmentParameter parameter in functionSegment.Parameters) { string name = parameter.Name; object value = functionSegment.GetParameterValue(name); AddFunctionParameters(function, name, value, controllerContext.RouteData, routingConventionsStore, null); } // Append the optional parameters into RouteData. ODataOptionalParameter optional = new ODataOptionalParameter(); foreach (var optionalParameter in function.Parameters.OfType <IEdmOptionalParameter>()) { if (!functionSegment.Parameters.Any(c => c.Name == optionalParameter.Name)) { optional.Add(optionalParameter); } } if (optional.OptionalParameters.Any()) { controllerContext.RouteData.Add(ODataRouteConstants.OptionalParameters, optional); } }
public static void AddFunctionParameterToRouteData(this HttpControllerContext controllerContext, OperationSegment functionSegment) { Contract.Assert(controllerContext != null); Contract.Assert(functionSegment != null); IDictionary <string, object> routingConventionsStore = controllerContext.Request.ODataProperties().RoutingConventionsStore; IEdmFunction function = functionSegment.Operations.First() as IEdmFunction; if (function == null) { return; } foreach (OperationSegmentParameter parameter in functionSegment.Parameters) { string name = parameter.Name; object value = functionSegment.GetParameterValue(name); AddFunctionParameters(function, name, value, controllerContext.RouteData.Values, routingConventionsStore, null); } }