@using Microsoft.EntityFrameworkCore @using OpenArchival.DataAccess @using MudBlazor @using OpenArchival.Blazor.ArtifactGroupingDisplay @SliderEntry.Title @if (!string.IsNullOrEmpty(SliderEntry.Description)) { @SliderEntry.Description } @foreach (ArtifactGrouping grouping in ArtifactGroupings) {
}
@inject IDbContextFactory ContextFactory; @code { [Parameter] public required SearchPageSliderEntry SliderEntry { get; set; } private List ArtifactGroupings { get; set; } = []; protected override async Task OnParametersSetAsync() { await using var context = await ContextFactory.CreateDbContextAsync(); // First, handle the case where there are no tags to filter by. if (SliderEntry.FilterTags == null || !SliderEntry.FilterTags.Any()) { ArtifactGroupings = new List(); return; } // It's much more efficient to get the IDs of the tags first. var requiredTagIds = SliderEntry.FilterTags.Select(t => t.Id).ToList(); int requiredTagCount = requiredTagIds.Count; ArtifactGroupings = await context.ArtifactGroupings .Include(g => g.ChildArtifactEntries) .ThenInclude(e => e.Tags) .Include(g=>g.ChildArtifactEntries) .ThenInclude(e=>e.Files) .Where(grouping => grouping.ChildArtifactEntries.Any(entry => entry.Tags.Count(tag => requiredTagIds.Contains(tag.Id)) == requiredTagCount ) ) // AsSplitQuery() is a performance optimization for complex queries with multiple Includes. .AsSplitQuery() .ToListAsync(); StateHasChanged(); } }