internal static object ConvertTo(ODataParameterValue parameterValue, HttpActionContext actionContext, ModelBindingContext bindingContext)
            {
                Contract.Assert(parameterValue != null && parameterValue.EdmType != null);

                object oDataValue = parameterValue.Value;
                if (oDataValue == null || oDataValue is ODataNullValue)
                {
                    return null;
                }

                IEdmTypeReference edmTypeReference = parameterValue.EdmType;
                ODataDeserializerContext readContext = BuildDeserializerContext(actionContext, bindingContext, edmTypeReference);

                // complex value
                ODataComplexValue complexValue = oDataValue as ODataComplexValue;
                if (complexValue != null)
                {
                    IEdmComplexTypeReference edmComplexType = edmTypeReference.AsComplex();
                    Contract.Assert(edmComplexType != null);

                    ODataComplexTypeDeserializer deserializer =
                        (ODataComplexTypeDeserializer)DeserializerProvider.GetEdmTypeDeserializer(edmComplexType);

                    return deserializer.ReadInline(complexValue, edmComplexType, readContext);
                }

                // collection of primitive, enum, complex
                ODataCollectionValue collectionValue = oDataValue as ODataCollectionValue;
                if (collectionValue != null)
                {
                    return ConvertCollection(collectionValue, edmTypeReference, bindingContext, readContext);
                }

                // enum value
                ODataEnumValue enumValue = oDataValue as ODataEnumValue;
                if (enumValue != null)
                {
                    IEdmEnumTypeReference edmEnumType = edmTypeReference.AsEnum();
                    Contract.Assert(edmEnumType != null);

                    ODataEnumDeserializer deserializer =
                        (ODataEnumDeserializer)DeserializerProvider.GetEdmTypeDeserializer(edmEnumType);

                    return deserializer.ReadInline(enumValue, edmEnumType, readContext);
                }

                // primitive value
                if (edmTypeReference.IsPrimitive())
                {
                    return EdmPrimitiveHelpers.ConvertPrimitiveValue(oDataValue, bindingContext.ModelType);
                }

                // Entity, Feed, Entity Reference or collection of entity reference
                return ConvertFeedOrEntry(oDataValue, edmTypeReference, readContext);
            }
        public static void AddKeyValues(string name, object value, IEdmTypeReference edmTypeReference,
            IDictionary<string, object> routeValues,
            IDictionary<string, object> odataValues)
        {
            Contract.Assert(routeValues != null);
            Contract.Assert(odataValues != null);

            object routeValue = null;
            object odataValue = null;
            ConstantNode node = value as ConstantNode;
            if (node != null)
            {
                ODataEnumValue enumValue = node.Value as ODataEnumValue;
                if (enumValue != null)
                {
                    odataValue = new ODataParameterValue(enumValue, edmTypeReference);
                    routeValue = enumValue.Value;
                }
            }
            else
            {
                odataValue = new ODataParameterValue(value, edmTypeReference);
                routeValue = value;
            }

            // for without FromODataUri
            routeValues[name] = routeValue;

            // For FromODataUri
            string prefixName = ODataParameterValue.ParameterValuePrefix + name;
            odataValues[prefixName] = odataValue;
        }