/// <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);
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        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);
            }
        }