public FilterDto Flatten(FilterDto filter) { var res = new FilterDto { Count = filter.Count, Page = filter.Page, Sorting = filter.Sorting }; var queue = new Queue <Tuple <string, JToken> >(); foreach (var pair in filter.Filter) { queue.Enqueue(Tuple.Create(pair.Key, pair.Value)); } var resFilter = new Dictionary <string, JToken>(); while (queue.Count > 0) { var item = queue.Dequeue(); var jObject = item.Item2 as JObject; if (jObject != null) { var range = jObject.ToObject <FilterServiceExtension.RangeDto>(); var contains = jObject.ToObject <FilterServiceExtension.ContainsDto>(); if ((range != null && range.IsValid) || (contains != null && contains.IsValid)) { resFilter[item.Item1] = item.Item2; continue; } foreach (var pair in jObject) { queue.Enqueue(Tuple.Create($"{item.Item1}.{pair.Key}", pair.Value)); } } else { resFilter[item.Item1] = item.Item2; } } res.Filter = resFilter; return(res); }
public static IQueryable <TValue> ApplyFilter <TValue>(this IQueryable <TValue> list, FilterDto filter) { if (filter == null) { return(list); } if (filter.Filter != null) { foreach (var pair in filter.Filter) { if (pair.Value?.Type == JTokenType.Object) { var range = pair.Value.ToObject <RangeDto>(); if (range != null && range.IsValid) { if (range.From != null) { list = list.Where(GreaterThanOrEqual <TValue>(pair.Key, range.From)); } if (range.To != null) { list = list.Where(LessThanOrEqual <TValue>(pair.Key, range.To)); } } var contains = pair.Value.ToObject <ContainsDto>(); if (contains != null && contains.IsValid) { list = list.Where(ContainsAny <TValue>(pair.Key, contains.Any)); } } else { var value = ((JValue)pair.Value)?.Value; list = list.Where(Where <TValue>(pair.Key, value)); } } } if (filter.Sorting != null) { foreach (var sorting in filter.Sorting) { list = sorting.Value == FilterDto.SortOrder.Asc ? list.OrderBy(KeySelector <TValue>(sorting.Key)) : list.OrderByDescending(KeySelector <TValue>(sorting.Key)); } } return(list); }