예제 #1
0
 /// <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);
 }
예제 #2
0
        /// <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;
            }
        }