/// <summary>
        /// Gets the EDM model for the given type and request. Override this method to customize the EDM model used for
        /// querying.
        /// </summary>
        /// <param name="elementClrType">The CLR type to retrieve a model for.</param>
        /// <param name="request">The request message to retrieve a model for.</param>
        /// <param name="actionDescriptor">The action descriptor for the action being queried on.</param>
        /// <returns>The EDM model for the given type and request.</returns>
        public virtual IEdmModel GetModel(Type elementClrType, HttpRequestMessage request,
            HttpActionDescriptor actionDescriptor)
        {
            // Get model for the request
            IEdmModel model = request.ODataProperties().Model;

            if (model == null || model.GetEdmType(elementClrType) == null)
            {
                // user has not configured anything or has registered a model without the element type
                // let's create one just for this type and cache it in the action descriptor
                model = actionDescriptor.GetEdmModel(elementClrType);
            }

            Contract.Assert(model != null);
            return model;
        }
        private static ODataQueryContext CreateQueryContext(Type entityClrType, HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
        {
            // Primitive types do not construct an EDM model and deal only with the CLR Type
            if (TypeHelper.IsQueryPrimitiveType(entityClrType))
            {
                return new ODataQueryContext(entityClrType);
            }
            else
            {
                // Get model for the entire app
                IEdmModel model = configuration.GetEdmModel();

                if (model == null)
                {
                    // user has not configured anything, now let's create one just for this type
                    // and cache it in the action descriptor
                    model = actionDescriptor.GetEdmModel(entityClrType);
                    Contract.Assert(model != null);
                }

                // parses the query from request uri
                return new ODataQueryContext(model, entityClrType);
            }
        }