private async Task <object> GetResultWithCount <T>(IQueryable <T> queryable, HttpRequestMessage httpRequestMessage,
                                                           IQueryableToODataResultConverter converter)
        {
            var queryOptions = GetQueryOptions <T>(httpRequestMessage);

            return(await converter.ToListWithCountAsync(queryable, queryOptions, default(CancellationToken)));
        }
        public override async Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
        {
            await base.OnActionExecutedAsync(actionExecutedContext, cancellationToken);

            var originalContent = actionExecutedContext.Response?.Content as ObjectContent;

            if (originalContent?.Value != null &&
                originalContent.ObjectType.IsConstructedGenericType &&
                originalContent.ObjectType.GetGenericTypeDefinition() == typeof(IQueryable <>))
            {
                Type entityType   = originalContent.ObjectType.GenericTypeArguments[0];
                bool includeCount = actionExecutedContext.Request.RequestUri.Query.Contains("$count=true") ||
                                    actionExecutedContext.Request.RequestUri.Query.Contains("%24count=true"); // TODO improve

                IQueryable queryable = (IQueryable)originalContent.Value;
                IQueryableToODataResultConverter converter =
                    ODataResultConverters.FirstOrDefault(x => x.Supports(queryable))
                    ?? DefaultConverter.Instance;

                object result;
                if (includeCount)
                {
                    var method = this.GetType().GetMethod(nameof(GetResultWithCount), BindingFlags.Instance | BindingFlags.NonPublic)
                                 .MakeGenericMethod(new[] { entityType });
                    result = await(Task <object>) method.Invoke(this, new object[] { queryable, actionExecutedContext.Request, converter });
                }
                else
                {
                    var method = this.GetType().GetMethod(nameof(GetResult), BindingFlags.Instance | BindingFlags.NonPublic)
                                 .MakeGenericMethod(new[] { entityType });
                    result = await(Task <object>) method.Invoke(this, new object[] { queryable, actionExecutedContext.Request, converter });
                }

                actionExecutedContext.Response.Content = (HttpContent)typeof(ObjectContent <>)
                                                         .MakeGenericType(result.GetType())
                                                         .GetConstructors().First(x => x.GetParameters().Length == 3)
                                                         .Invoke(new object[]
                {
                    result,
                    originalContent.Formatter,
                    originalContent.Headers.ContentType.MediaType
                });
            }
        }
Пример #3
0
        public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
        {
            var originalContent = context.Result as ObjectResult;

            if (originalContent?.Value != null &&
                originalContent.DeclaredType.IsConstructedGenericType &&
                originalContent.DeclaredType.GetGenericTypeDefinition() == typeof(IQueryable <>))
            {
                Type entityType = originalContent.DeclaredType.GenericTypeArguments[0];
                ODataQueryOptions queryOptions = GetQueryOptions(context, entityType);

                bool includeCount = queryOptions.Count?.Value ?? false;

                var odataResultConverters =
                    ((IKernel)context.HttpContext.RequestServices.GetRequiredService(typeof(IKernel)))
                    .GetAll <IQueryableToODataResultConverter>();

                IQueryable queryable = (IQueryable)originalContent.Value;
                IQueryableToODataResultConverter converter =
                    odataResultConverters.FirstOrDefault(x => x.Supports(queryable))
                    ?? DefaultConverter.Instance;

                object result;
                if (includeCount)
                {
                    var method = GetType().GetMethod(nameof(GetResultWithCount), BindingFlags.Instance | BindingFlags.NonPublic)
                                 .MakeGenericMethod(new[] { entityType });
                    result = await(Task <object>) method.Invoke(this, new object[] { queryable, queryOptions, converter });
                }
                else
                {
                    var method = GetType().GetMethod(nameof(GetResult), BindingFlags.Instance | BindingFlags.NonPublic)
                                 .MakeGenericMethod(new[] { entityType });
                    result = await(Task <object>) method.Invoke(this, new object[] { queryable, queryOptions, converter });
                }

                context.Result = new ObjectResult(result);
            }

            await next();
        }
Пример #4
0
 private async Task <object> GetResultWithCount <T>(IQueryable <T> queryable, ODataQueryOptions <T> queryOptions,
                                                    IQueryableToODataResultConverter converter)
 {
     return(await converter.ToListWithCountAsync(queryable, queryOptions, default(CancellationToken)));
 }