public virtual async Task <IActionResult> GetMaterialsFromMultiCategories(GetMaterialsRequest materialsRequest) { SectionServerCached section = sectionsCache.GetSectionServerCached(materialsRequest.SectionName, User.Roles); if (section == null) { return(BadRequest($"No component {materialsRequest.SectionName} found in cache")); } MaterialsServerSection sectionData = section.GetData <MaterialsServerSection>(); var сategories = categoriesCache.GetAllCategoriesWithChildren(sectionData.CategoriesNames); IList <CategoryCached> categories = authorizationService.GetAllowedCategories(User.Roles, сategories.Values, operationKeysContainer.MaterialAndCommentsRead); if (categories.Count == 0) { return(BadRequest("No categories to show")); } IEnumerable <int> categoriesIds = categories.Select(x => x.Id).ToArray(); MaterialsSortOptionsService.MaterialsSortOptions.TryGetValue(materialsRequest.Sort, out Func <IQueryable <Material>, IOrderedQueryable <Material> > sort); var options = new MaterialsShowOptions { CategoriesIds = categoriesIds, Page = materialsRequest.Page, PageSize = sectionData.PageSize, Sort = sort }; using var scope = serviceProvider.CreateScope(); IMaterialsQueryPresenter materialsQueryPresenter = (IMaterialsQueryPresenter)scope.ServiceProvider.GetRequiredService(MaterialsPresenterTypes.GetBySection(section)); return(await CacheContentAsync(section, categoriesIds, () => materialsQueryPresenter.GetMaterialsFromMultiCategoryAsync(options), materialsRequest.Page)); }