public DTO.Messages.Wrapper GetAll([FromBody] DTO.Messages.SearchPage Search = null) { var Result = AuthorizeResponse(new HashSet <string> { "Administrator" }); if (Search == null) { Search = new DTO.Messages.SearchPage(); } else { var Max = (Search.MaxPrice > Search.MinPrice) ? Search.MaxPrice : Search.MinPrice; var Min = (Search.MaxPrice < Search.MinPrice) ? Search.MaxPrice : Search.MinPrice; Search.MaxPrice = Max; Search.MinPrice = Min; } IQueryable <DTO.Databases.Product> Query = null; if (string.IsNullOrWhiteSpace(Search.SearchTerm)) { Query = MongoItems.QueryableCollection; } else { var SearchKey = new DTO.Projection.Search { SearchTerm = Search.SearchTerm, Categories = Search.Categories, SubCategories = Search.SubCategories }; var Cached = RedisItems.GetList(SearchKey); if (Cached == null || Cached.Count() == 0) { Cached = MongoItems.SearchThru(Search, false); RedisItems.SaveList(Cached, SearchKey); Query = Cached.AsQueryable(); } else { Query = Cached.AsQueryable(); } var Offset = Query.Count() < (Search.Page + 1) * Search.PageLimit ? Query.Count() : (Search.Page + 1) * Search.PageLimit; Offset = (Offset - Search.PageLimit < 0) ? 0 : Offset - Search.PageLimit; var Taken = Query.Count() - Offset; Query = Query.Skip(Offset).Take(Taken); Result.Data = Query; if (Query.Count() == 0) { Result.Code = 404; Result.Status = "Not Found"; } } return(Result); }
public IEnumerable <DTO.Databases.Product> SearchThru(DTO.Messages.SearchPage Search, bool TimeBased = true) { var Cached = Collection .FindSync(Builders <DTO.Databases.Product> .Filter.Text(Search.SearchTerm)) .ToList(); var Query = Cached.AsQueryable(); if (Search.MaxPrice < long.MaxValue) { Query.Where(x => x.Price <= Search.MaxPrice); } if (Search.MinPrice > 0) { Query.Where(x => x.Price >= Search.MinPrice); } if (Search.Categories.Count > 0) { Query = Query.Where(x => Search.Categories.Intersect(x.Categories).Count() > 0); } if (Search.SubCategories.Count > 0) { Query = Query.Where(x => Search.SubCategories.Intersect(x.SubCategories).Count() > 0); } if (TimeBased) { Query.Where(x => x.Scored() > 0); } return(Query); }