@using Groceries.Data @using Microsoft.EntityFrameworkCore @layout Layout @inject AppDbContext DbContext @inject NavigationManager Navigation @inject IHttpContextAccessor HttpContextAccessor Groceries – Items

Items

@**@ @foreach (var item in items) { @**@ }
Brand Name Last Purchased Barcode
@item.Brand @item.Name @(item.HasBarcode ? "✓" : "") Edit
@code { [SupplyParameterFromQuery] public int? Page { get; set; } [SupplyParameterFromQuery] public string? Search { get; set; } private record ItemModel(Guid Id, string Brand, string Name, bool HasBarcode, DateTime? LastPurchasedAt); private ListPageModel items = ListPageModel.Empty(); protected override async Task OnParametersSetAsync() { var itemsQuery = DbContext.Items.AsQueryable(); if (!string.IsNullOrEmpty(Search)) { var searchPattern = $"%{Search}%"; itemsQuery = itemsQuery.Where(item => EF.Functions.ILike(item.Brand + ' ' + item.Name, searchPattern)); } items = await itemsQuery .OrderBy(item => item.Brand) .ThenBy(item => item.Name) .GroupJoin( DbContext.ItemPurchases.Where(purchase => purchase.IsLastPurchase), item => item.Id, lastPurchase => lastPurchase.ItemId, (item, lastPurchase) => new { item, lastPurchase }) .SelectMany( group => group.lastPurchase.DefaultIfEmpty(), (group, lastPurchase) => new ItemModel( group.item.Id, group.item.Brand, group.item.Name, group.item.Barcodes.Count != 0, lastPurchase != null ? lastPurchase.CreatedAt : null)) .ToListPageModelAsync(Page.GetValueOrDefault(), cancellationToken: HttpContextAccessor.HttpContext!.RequestAborted); if (items.Page != Page) { Navigation.NavigateTo(Navigation.GetUriWithQueryParameter("page", items.Page)); } } }