FilterByPredicate(hash,x=>x.ForeignBookId,localHash,profile,(x,p)=>(x.Ratings.Popularity>=p.MinPopularity)||x.ReleaseDate>DateTime.UtcNow,"rating criteria not met");
FilterByPredicate(hash,x=>x.ForeignBookId,localHash,profile,BookAllowedByRating,"rating criteria not met");
FilterByPredicate(hash,x=>x.ForeignBookId,localHash,profile,(x,p)=>!p.SkipMissingDate||x.ReleaseDate.HasValue,"release date is missing");
FilterByPredicate(hash,x=>x.ForeignBookId,localHash,profile,(x,p)=>!p.SkipPartsAndSets||!IsPartOrSet(x,seriesLinks.GetValueOrDefault(x),titles),"book is part of set");
FilterByPredicate(hash,x=>x.ForeignBookId,localHash,profile,(x,p)=>!p.SkipSeriesSecondary||!seriesLinks.ContainsKey(x)||seriesLinks[x].Any(y=>y.IsPrimary),"book is a secondary series item");