public void Can_Deserialize_And_Execute_Sort_From_Query_String() { const string text = "year DESC, make ASC"; var converter = new SortTypeConverter(); var sort = (ISort)converter.ConvertFrom(text); Assert.IsNotNull(sort); Assert.IsInstanceOfType(sort, typeof(DynamicLinqSort)); var expected = Cars.OrderByDescending(x => x.Year).ThenBy(x => x.Make).ToList(); var actual = sort.ToDelegate<Car>()(Cars.AsQueryable()).ToList(); Assert.IsTrue(expected.SequenceEqual(actual)); }
private async Task BindFromUri(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken) { var uriBinding = _descriptor.BindWithAttribute(new FromUriAttribute()); await uriBinding.ExecuteBindingAsync(metadataProvider, actionContext, cancellationToken); var bindedValue = GetValue(actionContext) as IClientQuery; var query = GetValue(actionContext) as IClientQuery ?? Activator.CreateInstance(_descriptor.ParameterType) as IClientQuery; if (bindedValue == null) { SetValue(actionContext, query); } var clientFilterable = query as IClientFilterable; var clientSortable = query as IClientSortable; var clientPageable = query as IClientPageable; var queryString = actionContext.Request.GetQueryNameValuePairs() .Where(x => Keys.KnownKeys.Contains(x.Key)) .ToDictionary(x => x.Key, x => (object)x.Value); var routeDataValues = actionContext.Request.GetRouteData() .Values .Where(x => Keys.KnownKeys.Contains(x.Key)); var requestValues = queryString.Union(routeDataValues).ToDictionary(x => x.Key, x => x.Value); if (queryString.ContainsKey(Keys.Filter) && clientFilterable != null) { var converter = new QueryStringFilterConverter(); var filter = (IFilter)converter.ConvertFrom(queryString[Keys.Filter]); clientFilterable.ClientFilter = filter ?? new AlwaysTrueFilter(); } if (queryString.ContainsKey(Keys.Sort) && clientSortable != null) { var converter = new SortTypeConverter(); var sort = (ISort)converter.ConvertFrom(queryString[Keys.Sort]); clientSortable.ClientSort = sort ?? clientSortable.ClientSort ?? new RandomSort(); } if ((queryString.ContainsKey(Keys.PageNumber) || queryString.ContainsKey(Keys.PageSize)) && clientPageable != null) { int pageNumber = 1, pageSize = 10; var hasNumber = requestValues.ContainsKey(Keys.PageNumber) && int.TryParse(requestValues[Keys.PageNumber].ToString(), out pageNumber); var hasSize = requestValues.ContainsKey(Keys.PageSize) && int.TryParse(requestValues[Keys.PageSize].ToString(), out pageSize); var page = new ClientPage { PageNumber = hasNumber ? (int?)pageNumber : null, PageSize = hasSize ? (int?)pageSize : null }; clientPageable.ClientPage = page; } }