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; } }
public void Can_Deserialize_And_Execute_Filter_From_Query_String() { var filterTxt = File.ReadAllText("Files/filter.txt"); var converter = new QueryStringFilterConverter(); var filter = (IFilter)converter.ConvertFrom(HttpUtility.UrlDecode(filterTxt)); Assert.IsNotNull(filter); Assert.IsInstanceOfType(filter, typeof(DynamicLinqFilter)); var expected = Logs.Where( x => x.TimestampUtc > new DateTime(2014, 9, 1) && x.TimestampUtc < new DateTime(2014, 9, 30) && new string[] { "Error", "Warning" }.Contains(x.Level) && x.Type == null ).ToList(); var actual = Logs.AsQueryable().Where(filter.ToExpression<LogEntry>()).ToList(); Assert.IsTrue(expected.SequenceEqual(actual)); }
public void Can_Deserialize_And_Execute_Filter_From_Query_String() { var filterTxt = File.ReadAllText("Files/filter.txt"); var converter = new QueryStringFilterConverter(); var filter = (IFilter)converter.ConvertFrom(HttpUtility.UrlDecode(filterTxt)); Assert.IsNotNull(filter); Assert.IsInstanceOfType(filter, typeof(DynamicLinqFilter)); var expected = Logs.Where( x => x.TimestampUtc > new DateTime(2014, 9, 1) && x.TimestampUtc < new DateTime(2014, 9, 30) && new string[] { "Error", "Warning" }.Contains(x.Level) && x.Type == null ).ToList(); var actual = Logs.AsQueryable().Where(filter.ToExpression <LogEntry>()).ToList(); Assert.IsTrue(expected.SequenceEqual(actual)); }