/// <summary>
        /// Executes a lookup against a table.
        /// </summary>
        /// <param name="id">
        /// The id of the instance to lookup.
        /// </param>
        /// <param name="parameters">
        /// A dictionary of user-defined parameters and values to include in
        /// the request URI query string.
        /// </param>
        /// <returns>
        /// A task that will return with a result when the lookup finishes.
        /// </returns>
        internal Task <string> SendLookupAsync(object id, IDictionary <string, string> parameters)
        {
            Debug.Assert(id != null);

            string uriFragment = MobileServiceUrlBuilder.GetUriFragment(this.TableName, id);
            string queryString = MobileServiceUrlBuilder.GetQueryString(parameters);
            string uriString   = MobileServiceUrlBuilder.CombinePathAndQuery(uriFragment, queryString);

            return(this.MobileServiceClient.HttpClient.RequestAsync(HttpMethod.Get, uriString, null));
        }
        /// <summary>
        /// Inserts an <paramref name="instance"/> into the table.
        /// </summary>
        /// <param name="instance">
        /// The instance to insert into the table.
        /// </param>
        /// <param name="parameters">
        /// A dictionary of user-defined parameters and values to include in
        /// the request URI query string.
        /// </param>
        /// <returns>
        /// A task that will complete when the insert finishes.
        /// </returns>
        internal Task <string> SendInsertAsync(string instance, IDictionary <string, string> parameters)
        {
            Debug.Assert(instance != null);

            string uriFragment = MobileServiceUrlBuilder.GetUriFragment(this.TableName);
            string queryString = MobileServiceUrlBuilder.GetQueryString(parameters);
            string uriString   = MobileServiceUrlBuilder.CombinePathAndQuery(uriFragment, queryString);

            return(this.MobileServiceClient.HttpClient.RequestAsync(HttpMethod.Post, uriString, instance));
        }
        /// <summary>
        /// Excutes a query against the table.
        /// </summary>
        /// <param name="query">
        /// A query to execute.
        /// </param>
        /// <param name="parameters">
        /// A dictionary of user-defined parameters and values to include in
        /// the request URI query string.
        /// </param>
        /// <returns>
        /// A task that will return with results when the query finishes.
        /// </returns>
        public async Task <JToken> ReadAsync(string query, IDictionary <string, string> parameters)
        {
            string uriFragment      = MobileServiceUrlBuilder.GetUriFragment(this.TableName);
            string parametersString = MobileServiceUrlBuilder.GetQueryString(parameters);

            // Concatenate the query and the user-defined query string parameters
            if (!string.IsNullOrEmpty(parametersString))
            {
                if (!string.IsNullOrEmpty(query))
                {
                    query += '&' + parametersString;
                }
                else
                {
                    query = parametersString;
                }
            }

            string uriString = MobileServiceUrlBuilder.CombinePathAndQuery(uriFragment, query);

            string response = await this.MobileServiceClient.HttpClient.RequestAsync(HttpMethod.Get, uriString, null);

            return(response.ParseToJToken());
        }