@using Groceries.Data
@using Microsoft.EntityFrameworkCore
@layout Layout
@inject AppDbContext DbContext
Groceries – Items
@(context ? "✓" : "")
@*
Edit
*@
@code {
private record ItemModel
{
public Guid Id { get; init; }
public required string Brand { get; init; }
public required string Name { get; init; }
public bool HasBarcode { get; init; }
public DateTime? LastPurchasedAt { get; init; }
}
private IQueryable items = null!;
private PaginationState pagination = new();
[SupplyParameterFromQuery]
public string? Search { get; set; }
protected override void OnParametersSet()
{
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 = itemsQuery
.GroupJoin(
DbContext.ItemPurchases.Where(purchase => purchase.IsLastPurchase),
item => item.Id,
purchase => purchase.ItemId,
(item, purchases) => new { item, purchases })
.SelectMany(
group => group.purchases.DefaultIfEmpty(),
(group, lastPurchase) => new ItemModel
{
Id = group.item.Id,
Brand = group.item.Brand,
Name = group.item.Name,
HasBarcode = group.item.Barcodes.Count != 0,
LastPurchasedAt = lastPurchase != null ? lastPurchase.CreatedAt : null,
})
.OrderBy(item => item.Brand)
.ThenBy(item => item.Name);
}
}