@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();
}
}