示例#1
0
        public async Task <PagingResult <IEventWithLinks> > CustomFilter(int page, int pageSize,
                                                                         int?cityId,
                                                                         int?districtId,
                                                                         IFromToFilter <DateTime> startDateFilter,
                                                                         IFromToFilter <DateTime> endDateFilter,
                                                                         IFromToFilter <DateTime> dateFilter,
                                                                         SearchModel search)
        {
            using (var cp = _contextProviderFactory.Create())
            {
                var events =
                    cp.GetTable <Event>();

                if (cityId != null)
                {
                    events = events.Where(w => w.CityId == cityId);
                }

                if (districtId != null)
                {
                    events = events.Where(w => w.DistrictId == districtId);
                }

                if (startDateFilter != null)
                {
                    events =
                        events.Where(w => w.StartDate >= startDateFilter.From && w.StartDate <= startDateFilter.To);
                }

                if (endDateFilter != null)
                {
                    events =
                        events.Where(w => w.EndDate >= endDateFilter.From && w.EndDate <= endDateFilter.To);
                }

                if (dateFilter != null)
                {
                    events =
                        events.Where(w => (w.StartDate >= dateFilter.From && w.StartDate <= dateFilter.To) ||
                                     (w.EndDate >= dateFilter.From && w.EndDate <= dateFilter.To) ||
                                     (w.StartDate <= dateFilter.From && w.EndDate >= dateFilter.To));
                }

                IReadOnlyCollection <Event> eventsFinal =
                    await events.GetFilteredTable(search, cp)
                    .Skip((page - 1) * pageSize)
                    .Take(pageSize)
                    .ToArrayAsync();

                var paging =
                    new PagingResult <IEvent>()
                {
                    Total = events.Count(),
                    Items = !eventsFinal.Any()
                                                        ? new IEvent[0]
                                                        : DtoMapper.Map <IEvent[]>(eventsFinal),
                };

                var res =
                    await GetPagingWithLinksInternal(paging);

                return(res);
            }
        }
示例#2
0
        public async Task <PagingResult <IRouteWithLinks> > CustomFilter(int page, int pageSize,
                                                                         string name,
                                                                         bool?animals,
                                                                         int[] peopleTypeIds,
                                                                         int[] ageTypeIds,
                                                                         int[] subjectNameIds,
                                                                         bool subjectNamesAtLeastOne,
                                                                         int[] subjectTypeIds,
                                                                         bool subjectTypesAtLeastOne,
                                                                         int?cityId,
                                                                         int?districtId,
                                                                         IFromToFilter <float> durationFilter,
                                                                         IFromToFilter <float> lengthFilter, OrderModel orderModel)
        {
            using (var cp = _contextProviderFactory.Create())
            {
                var routes =
                    cp.GetTable <Route>();

                if (cityId != null)
                {
                    routes = routes.Where(w => w.CityId == cityId);
                }

                if (districtId != null)
                {
                    routes = routes.Where(w => w.DistrictId == districtId);
                }

                if (animals != null)
                {
                    routes =
                        routes.Where(w => w.Animals == animals);
                }

                if (!string.IsNullOrEmpty(name))
                {
                    routes =
                        routes.Where(w => w.Name.ToLower().Contains(name.ToLower(), StringComparison.InvariantCultureIgnoreCase));
                }


                if (peopleTypeIds?.Any() ?? false)
                {
                    var attrSubjIds =
                        cp.GetTable <RoutePeopleType>()
                        .ToArray()
                        .GroupBy(atts => atts.RouteId)
                        .Where(w => peopleTypeIds.All(a => w.Select(s => s.PeopleTypeId).Contains(a))).Select(s => s.Key);

                    routes =
                        routes.Where(w => attrSubjIds.Contains(w.Id));
                }

                if (ageTypeIds?.Any() ?? false)
                {
                    var attrSubjIds =
                        cp.GetTable <RouteAgeType>()
                        .ToArray()
                        .GroupBy(atts => atts.RouteId)
                        .Where(w => ageTypeIds.All(a => w.Select(s => s.AgeTypeId).Contains(a))).Select(s => s.Key);

                    routes =
                        routes.Where(w => attrSubjIds.Contains(w.Id));
                }

                if (subjectNameIds?.Any() ?? false)
                {
                    var attrSubjIds =
                        cp.GetTable <RouteSubjectName>()
                        .ToArray()
                        .GroupBy(atts => atts.RouteId)
                        .Where(w =>
                               subjectNamesAtLeastOne
                                                                        ? subjectNameIds.Any(a => w.Select(s => s.SubjectNameId).Contains(a))
                                                                        : subjectNameIds.All(a => w.Select(s => s.SubjectNameId).Contains(a)))
                        .Select(s => s.Key);

                    routes =
                        routes.Where(w => attrSubjIds.Contains(w.Id));
                }

                if (subjectTypeIds?.Any() ?? false)
                {
                    var attrSubjIds =
                        cp.GetTable <RouteSubjectType>()
                        .ToArray()
                        .GroupBy(atts => atts.RouteId)
                        .Where(w => subjectTypesAtLeastOne
                                                                ? subjectTypeIds.Any(a => w.Select(s => s.SubjectTypeId).Contains(a))
                                                                : subjectTypeIds.All(a => w.Select(s => s.SubjectTypeId).Contains(a)))
                        .Select(s => s.Key);

                    routes =
                        routes.Where(w => attrSubjIds.Contains(w.Id));
                }

                if (durationFilter != null)
                {
                    routes =
                        routes.Where(w => w.Time >= durationFilter.From && w.Time <= durationFilter.To);
                }

                if (lengthFilter != null)
                {
                    routes =
                        routes.Where(w => w.Length >= lengthFilter.From && w.Length <= lengthFilter.To);
                }

                IReadOnlyCollection <Route> routesFinal =
                    await routes.GetFilteredTable(new SearchModel()
                {
                    Order = orderModel
                }, cp)
                    .Skip((page - 1) * pageSize)
                    .Take(pageSize)
                    .ToArrayAsync();

                var paging =
                    new PagingResult <IRoute>()
                {
                    Total = routes.Count(),
                    Items = !routesFinal.Any()
                                                        ? new IRoute[0]
                                                        : DtoMapper.Map <IRoute[]>(routesFinal),
                };

                var res =
                    await GetPagingWithLinksInternal(paging);

                return(res);
            }
        }