示例#1
0
        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);
        }