public static QueryResult Parse(JToken response, Uri nextLink, bool validate) { var result = new QueryResult() { Response = response }; long? inlineCount = null; // Try and get the values as an array result.Values = response as JArray; if (result.Values == null && response is JObject) { // Otherwise try and get the values from the results property // (which is the case when we retrieve the count inline) result.Values = response[InlineCountResultsKey] as JArray; inlineCount = response.Value<long?>(InlineCountCountKey); if (result.Values == null && validate) { string responseStr = response != null ? response.ToString() : "null"; throw new InvalidOperationException(String.Format(CultureInfo.InvariantCulture, Resources.MobileServiceTable_ExpectedArray, responseStr)); } else if (result.Values == null) { result.Values = new JArray(response); } } // Get the count via the inline count or default an unspecified count to -1 result.TotalCount = inlineCount.GetValueOrDefault(-1L); result.NextLink = nextLink; return result; }
private bool EndOfResult(QueryResult result) { // if we got as many as we initially wanted // or there are no more results // then we're at the end return cursor.Complete || result.Values.Count == 0; }
// follows next links in the query result and returns final result private async Task<QueryResult> FollowNextLinks(QueryResult result) { while (!this.EndOfResult(result) && // if we are not at the end of result IsNextLinkValid(result.NextLink, this.options)) // and there is a valid link to get more results { this.CancellationToken.ThrowIfCancellationRequested(); result = await this.Table.ReadAsync(result.NextLink); await this.ProcessAll(result.Values); // process the results as soon as we've gotten them } return result; }