//change this to just cache and rework the other method to accept the list of items to be queried? public List <Listing> TryGetCachedListings(TheAfterParty.Domain.Concrete.ListingFilter filter, out int count) { /*List<Listing> listings = null; * * if (!_cache.TryGetValue(stockedListingsCacheKey, out listings)) * { * Task.Run(() => FillListingCache(_cache)); * } * else * { * filter.NewestDate = listings.Where(l => l.Quantity > 0).OrderByDescending(x => x.DateEdited).FirstOrDefault().DateEdited.Date; * } * * * return GetListingsWithFilter(filter, out count, listings).ToList(); */ return(GetListingsWithFilter(filter, out count).ToList()); }
public IEnumerable <Listing> GetListingsWithFilter(ListingFilter filter, out int TotalItems, List <Listing> listings = null) { IQueryable <Listing> listingQuery; if (listings == null) { listingQuery = context.Listings .Include(x => x.ChildListings.Select(y => y.Product.Listings.Select(z => z.ChildListings))) .Include(x => x.ChildListings.Select(y => y.Platforms)) .Include(x => x.ChildListings.Select(y => y.DiscountedListings)) .Include(x => x.DiscountedListings) .Include(x => x.Platforms) .Include(x => x.Product.Listings.Select(z => z.ChildListings)) .AsQueryable() .Where(x => x.Quantity > 0 && x.ListingPrice > 0); } else { listingQuery = listings.AsQueryable <Listing>(); } if (filter.IsDailyDeal) { listingQuery = listingQuery.Where(x => x.DiscountedListings.Any(y => y.DailyDeal)); } if (filter.WishlistFilter) { if (filter.LoggedInUser != null) { listingQuery = listingQuery.Where(x => filter.LoggedInUser.WishlistEntries.Select(y => y.AppID).Any(z => z == x.Product.AppID)); } else { listingQuery = listingQuery.Where(x => context.WishlistEntries.Where(y => y.UserID.Equals(filter.UserID)).Select(y => y.AppID).Any(z => z == x.Product.AppID)); } } if (filter.IsOtherDeal) { listingQuery = listingQuery.Where(x => x.DiscountedListings.Any(y => y.DailyDeal == false && y.WeeklyDeal == false)); } if (filter.IsWeeklyDeal) { listingQuery = listingQuery.Where(x => x.DiscountedListings.Any(y => y.WeeklyDeal)); } if (filter.IsAllDeal) { listingQuery = listingQuery.Where(x => x.DiscountedListings.Any()); } if (filter.IsNewest) { DateTime date; if (filter.NewestDate != null) { date = (DateTime)filter.NewestDate; } else { date = context.Listings.Where(l => l.Quantity > 0).OrderByDescending(x => x.DateEdited).FirstOrDefault().DateEdited.Date; } var day = date.Day; var month = date.Month; var year = date.Year; listingQuery = listingQuery.Where(x => x.DateEdited.Day == day && x.DateEdited.Year == year && x.DateEdited.Month == month); } if (filter.Date != null) { var date = (DateTime)filter.Date; var day = date.Day; var month = date.Month; var year = date.Year; listingQuery = listingQuery.Where(x => x.DateEdited.Day == day && x.DateEdited.Year == year && x.DateEdited.Month == month); } if (String.IsNullOrWhiteSpace(filter.SearchText) == false) { var searchText = filter.SearchText.ToLower(); listingQuery = listingQuery.Where(x => x.ListingName.ToLower().Contains(searchText)); } if (filter.BeginsWithFilter != filter.BeginsWithSentinel) { string beginsWithText = filter.BeginsWithFilter.ToString(); if (filter.BeginsWithSentinel != '0') { listingQuery = listingQuery.Where(x => x.ListingName.StartsWith(beginsWithText) || x.ListingName.ToLower().StartsWith(beginsWithText)); } else { listingQuery = listingQuery.Where(x => !char.IsLetter(x.ListingName.First())); } } if (String.IsNullOrWhiteSpace(filter.UserID) == false) { if (filter.UnownedFilter) { listingQuery = listingQuery.Where(x => !context.OwnedGames.Where(y => y.UserID.Equals(filter.UserID)).Select(y => y.AppID).Any(z => z == x.Product.AppID)); } } if ((filter.UnownedFilter | filter.BlacklistFilter | filter.AffordableFilter) == false) { if (filter.FriendAppIDs.Count() > 0) { listingQuery = listingQuery.Where(x => !filter.FriendAppIDs.Any(z => z == x.Product.AppID)); } } if (filter.PlatformID != 0) { listingQuery = listingQuery.Where(x => x.Platforms.Select(y => y.PlatformID).Contains(filter.PlatformID)); } if (String.IsNullOrWhiteSpace(filter.UserID) == false) { if (filter.BlacklistFilter) { if (filter.LoggedInUser != null) { List <int> ids = filter.LoggedInUser.BlacklistedListings.Select(z => z.ListingID).ToList(); listingQuery = listingQuery.Where(x => !ids.Any(a => a == x.ListingID)); //IEnumerable<Listing> blacklist = filter.LoggedInUser.BlacklistedListings.AsEnumerable(); //listingQuery = from listing in listingQuery where !(from bl in blacklist select bl.ListingID).Contains(listing.ListingID) select listing; } //else //{ // //List<int> ids = filter.LoggedInUser.BlacklistedListings.Select(z => z.ListingID).ToList(); // //listingQuery = listingQuery.Where(x => !ids.Any(a => a == x.ListingID)); //} } } if (String.IsNullOrWhiteSpace(filter.UserID) == false) { if (filter.AffordableFilter) { if (filter.LoggedInUser != null) { listingQuery = listingQuery.Where(x => x.ListingPrice <= filter.LoggedInUser.Balance); } else { listingQuery = listingQuery.Where(x => x.ListingPrice <= context.Users.FirstOrDefault(y => y.Id.Equals(filter.UserID)).Balance); } } } if (filter.TagIDs.Count > 0) { listingQuery = listingQuery.Where(x => !filter.TagIDs.Except(x.Product.Tags.Select(y => y.TagID)).Any()); } if (filter.ProductCategoryIDs.Count > 0) { listingQuery = listingQuery.Where(x => !filter.ProductCategoryIDs.Except(x.Product.ProductCategories.Select(y => y.ProductCategoryID)).Any()); } if (filter.GameSort > 0) { if (filter.GameSort == 1) { listingQuery = listingQuery.OrderBy(x => x.ListingName); } else { listingQuery = listingQuery.OrderByDescending(x => x.ListingName); } } else if (filter.PriceSort > 0) { if (filter.PriceSort == 1) { listingQuery = listingQuery.OrderBy(x => x.ListingPrice).ThenBy(x => x.ListingName); } else { listingQuery = listingQuery.OrderByDescending(x => x.ListingPrice).ThenBy(x => x.ListingName); } } else if (filter.QuantitySort > 0) { if (filter.QuantitySort == 1) { listingQuery = listingQuery.OrderBy(x => x.Quantity).ThenBy(x => x.ListingName); } else { listingQuery = listingQuery.OrderByDescending(x => x.Quantity).ThenBy(x => x.ListingName); } } TotalItems = listingQuery.Count(); if (filter.PaginationNum > 0 && filter.Page > 0) { listingQuery = listingQuery.Skip((filter.Page - 1) * filter.PaginationNum).Take(filter.PaginationNum); } else if (filter.PaginationNum > 0) { listingQuery = listingQuery.Take(filter.PaginationNum); } return(listingQuery); }