public async Task <HttpResponseMessage> Get(ODataQueryOptions <Watch> options) { var validationSettings = new ODataValidationSettings { MaxTop = 100, AllowedArithmeticOperators = AllowedArithmeticOperators.None, AllowedFunctions = AllowedFunctions.None, AllowedLogicalOperators = AllowedLogicalOperators.Equal | AllowedLogicalOperators.And | AllowedLogicalOperators.GreaterThan | AllowedLogicalOperators.GreaterThanOrEqual | AllowedLogicalOperators.LessThan | AllowedLogicalOperators.LessThanOrEqual, AllowedQueryOptions = AllowedQueryOptions.Filter | AllowedQueryOptions.OrderBy | AllowedQueryOptions.Skip | AllowedQueryOptions.Top | AllowedQueryOptions.InlineCount }; validationSettings.AllowedOrderByProperties.Add("Name"); validationSettings.AllowedOrderByProperties.Add("Created"); validationSettings.AllowedOrderByProperties.Add("HitsCount"); // Validating OData try { options.Validate(validationSettings); } catch (Exception) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ResponseMessages.InvalidQueryOptions)); } // Parsing filter parameters DataQueryOptions filter; try { filter = _mapper.Map <ODataQueryOptions, DataQueryOptions>(options); } catch (AutoMapperMappingException) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ResponseMessages.InvalidQueryOptions)); } // Special instructions for UserId filtering DataFilterRule userIdFilter = filter.Filters.FirstOrDefault(f => string.Compare(f.Name, NameOfHelper.PropertyName <Watch>(x => x.UserId), StringComparison.OrdinalIgnoreCase) == 0 && f.Type == DataFilterTypes.Equal); if (userIdFilter == null || userIdFilter.Value == null) { // For backward compatibility we treats not specified or empty UserId as current user if (string.IsNullOrEmpty(UserId)) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.Unauthorized, ResponseMessages.UnathorizedRequest)); } if (userIdFilter == null) { userIdFilter = new DataFilterRule { Name = NameOfHelper.PropertyName <Watch>(x => x.UserId), Type = DataFilterTypes.Equal, Value = UserId }; filter.Filters.Add(userIdFilter); } else { userIdFilter.Value = UserId; } } else if (string.Compare(userIdFilter.Value.ToString(), UserIdAllConstant, StringComparison.OrdinalIgnoreCase) == 0) { // special constant $all means not filtering by UserId userIdFilter.Value = null; } // Retrieving projects DataResult <Watch> watchProjects; try { watchProjects = await _watchProjectRepository.GetSequenceAsync(filter, UserId); } catch (NotSupportedException) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, ResponseMessages.BadRequest)); } if (filter.Count) { var pageResult = new PageResult <Watch>(watchProjects.Results, null, watchProjects.Count); return(Request.CreateResponse(HttpStatusCode.OK, pageResult)); } return(Request.CreateResponse(HttpStatusCode.OK, watchProjects.Results)); }