예제 #1
0
        private static OkObjectResult CreateResult(object value, HypermediaResponse hypermediaResponse)
        {
            var resultValue = value;

            if (hypermediaResponse != null)
            {
                resultValue = new HypermediaResponse(value)
                {
                    Links = hypermediaResponse.Links
                };
            }

            return(new OkObjectResult(resultValue));
        }
예제 #2
0
        private static async Task <ObjectResult> ApplyODataAsync <T>(ActionContext context, IQueryable rawData, HypermediaResponse hypermediaResponse)
        {
            var data = (IQueryable <T>)rawData;

            var properties = new Lazy <PropertyInfo[]>(() => typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance));

            var  query     = context.HttpContext.Request.Query;
            bool hasSelect = false;

            if (query.HasParam("$filter", out var filterValue))
            {
                data = ODataFilterOperator.Apply(data, properties.Value, filterValue);
            }

            if (query.HasParam("$orderby", out var orderByValue))
            {
                data = ODataOrderByOperator.Apply(data, properties.Value, orderByValue);
            }

            IQueryable <object> projected;

            if (query.HasParam("$select", out var selectValue) && !selectValue.Equals("*"))
            {
                projected = ODataSelectOperator.Apply(data, properties.Value, selectValue);
                hasSelect = true;
            }
            else
            {
                projected = data.Cast <object>();
            }

            if (query.HasIntParam("$skip", out int skip))
            {
                projected = projected.Skip(skip);
            }

            if (query.HasIntParam("$top", out int top))
            {
                projected = projected.Take(top);
            }

            bool isAsync = projected.Provider is IAsyncQueryProvider;

            var result = query.ContainsKey("$count")
                ? CreateResult(isAsync ? await projected.CountAsync() : projected.Count(), hypermediaResponse)
                : CreateResult(isAsync ? await projected.ToListAsync() : projected.ToList(), hypermediaResponse);

            if (hasSelect)
            {
                result.Formatters.Add(SelectFormatter);
            }

            return(result);
        }