/// <summary> /// Invoke the GET query using the <paramref name="queryAggregator"/> and add to the <paramref name="coll"/>. /// </summary> /// <typeparam name="T">The entity <see cref="Type"/>.</typeparam> /// <param name="queryArgs">The <see cref="ODataArgs"/>.</param> /// <param name="queryAggregator">The <see cref="ODataQueryAggregator"/>.</param> /// <param name="coll">The collection to add items to.</param> internal async Task Query <T>(ODataArgs queryArgs, ODataQueryAggregator queryAggregator, ICollection <T> coll) { await ODataInvoker.Default.InvokeAsync(this, async() => { var request = await BuildQueryRequestAsync(queryArgs, queryAggregator.ToString()); OnCreatingRequest(request); var response = await SendRequestAsync(request); queryArgs.ResponseMessage = response; await ProcessQueryResponse(response, queryArgs, queryAggregator, coll); }, this); }
/// <summary> /// Processes the <b>Odata</b> <i>query</i> <see cref="HttpResponseMessage"/>. /// </summary> /// <typeparam name="T">The entity <see cref="Type"/>.</typeparam> /// <param name="response">The <see cref="HttpResponseMessage"/>.</param> /// <param name="queryArgs">The <see cref="ODataArgs"/>.</param> /// <param name="queryAggregator">The <see cref="ODataQueryAggregator"/>.</param> /// <param name="coll">The collection to add to.</param> /// <returns>The <see cref="Task"/>.</returns> internal async Task ProcessQueryResponse <T>(HttpResponseMessage response, ODataArgs queryArgs, ODataQueryAggregator queryAggregator, ICollection <T> coll) { EnsureSuccessStatusCodeForResponse(response); var type = typeof(T); IODataMapper mapper = null; PropertyInfo pi = null; switch (queryAggregator.SelectClause.Selector.NodeType) { case System.Linq.Expressions.ExpressionType.MemberAccess: mapper = queryArgs.Mapper; var me = (System.Linq.Expressions.MemberExpression)queryAggregator.SelectClause.Selector; pi = (PropertyInfo)me.Member; break; default: mapper = queryArgs.Mapper.SrceType == type ? queryArgs.Mapper : ODataAutoMapper.GetMapper(type); break; } int?count = null; using (var s = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) using (var sr = new StreamReader(s)) using (var jr = new JsonTextReader(sr)) { var json = await JObject.LoadAsync(jr).ConfigureAwait(false); count = json.Value <int?>("@odata.count"); foreach (var jt in json.GetValue("value")) { var obj = mapper.MapFromOData(jt, Mapper.OperationTypes.Get); if (pi == null) { coll.Add((T)obj); } else { coll.Add((T)pi.GetValue(obj)); } } } if (count.HasValue && queryArgs.Paging != null && queryArgs.Paging.IsGetCount) { queryArgs.Paging.TotalCount = count.Value; } }