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); } }
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); } }