public static IQueryable <TModel> ApplyTagsFilter <TModel>(this IQueryable <TModel> query, IFilterByTags tagsFilter, Func <string, Expression <Func <TModel, bool> > > filterByTagName) { if (tagsFilter.FilterByTags != null && tagsFilter.FilterByTags.Any(tag => !string.IsNullOrWhiteSpace(tag))) { var predicate = (tagsFilter.FilterByTagsConnector == FilterConnector.Or) ? PredicateBuilder.False <TModel>() : PredicateBuilder.True <TModel>(); foreach (var tagName in tagsFilter.FilterByTags) { if (!string.IsNullOrWhiteSpace(tagName)) { Expression <Func <TModel, bool> > whereClause = filterByTagName(tagName); if (tagsFilter.FilterByTagsConnector == FilterConnector.Or) { predicate = predicate.Or(whereClause); } else { predicate = predicate.And(whereClause); } } } query = query.Where(predicate); } return(query); }
public static IQueryable <TModel> ApplySitemapTagsFilter <TModel>(this IQueryable <TModel> query, IFilterByTags tagsFilter) where TModel : Sitemap { if (tagsFilter != null && tagsFilter.FilterByTags != null) { var tags = tagsFilter.FilterByTags.Where(tag => !string.IsNullOrWhiteSpace(tag)).Distinct().ToArray(); if (tags.Length > 0) { if (tagsFilter.FilterByTagsConnector == FilterConnector.And) { query = query.Where(page => page.SitemapTags.Count(pageTag => tags.Contains(pageTag.Tag.Name) && !pageTag.IsDeleted && !pageTag.Tag.IsDeleted) == tags.Length); } else { query = query.Where(page => page.SitemapTags.Any(pageTag => tags.Contains(pageTag.Tag.Name) && !pageTag.IsDeleted && !pageTag.Tag.IsDeleted)); } } } return(query); }