private static IQueryable <EFTypes.IndexedFile> Filter(TaggerDbContext dbContext, ProcessedInput userQuery) { var idsMatchingIncludeCriteria = FileIdsMatchingCriteria(dbContext, userQuery.IncludeTerms, Enumerable.All); var idsMatchingExcludeCriteria = FileIdsMatchingCriteria(dbContext, userQuery.ExcludeTerms, Enumerable.Any); return(dbContext.FileRecords .Include(fileRec => fileRec.FileTagPairs) .Where(fileRec => userQuery.IncludeTerms.Count == 0 ? true : idsMatchingIncludeCriteria.Contains(fileRec.Id)) .Where(fileRec => !idsMatchingExcludeCriteria.Contains(fileRec.Id))); }
public static IEnumerable <EFTypes.IndexedFile> GetPage(TaggerDbContext dbContext, ProcessedInput userQuery, int itemsPerPage) { var page = Math.Max(1, userQuery.Page); return (Filter(dbContext, userQuery) .Skip(itemsPerPage * (page - 1)) .Take(itemsPerPage) .AsEnumerable()); }
private static ImmutableList <int> FileIdsMatchingCriteria(TaggerDbContext dbContext, ImmutableList <string> terms, Func <IEnumerable <ImmutableList <int> >, Func <ImmutableList <int>, bool>, bool> anyOrAll) { ImmutableList <ImmutableList <int> > fileIdsPerTerm = terms.Select (s => ( from pair in dbContext.FileTagPairs where EF.Functions.Like(pair.Tag, $"%{s}%") select pair.FileRecordId ) .ToImmutableList() ).ToImmutableList(); return(fileIdsPerTerm .SelectMany(x => x) .Distinct() .Where(x => anyOrAll(fileIdsPerTerm, y => y.Contains(x))) .ToImmutableList()); }
public FileListController(ILogger <FileListController> logger, TaggerDbContext dbContext) { _logger = logger; _dbContext = dbContext; }