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)); }
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); }