diff --git a/Groceries.Data/Items/ItemPurchase.cs b/Groceries.Data/Items/ItemPurchase.cs index de44b8f..884496e 100644 --- a/Groceries.Data/Items/ItemPurchase.cs +++ b/Groceries.Data/Items/ItemPurchase.cs @@ -8,6 +8,7 @@ public class ItemPurchase public Guid StoreId { get; init; } public decimal Price { get; init; } public int Quantity { get; init; } + public bool IsLastPurchase { get; init; } public Item? Item { get; init; } public Transaction? Transaction { get; init; } diff --git a/Groceries.Data/Migrations/20230728185157_update_item_purchases.sql b/Groceries.Data/Migrations/20230728185157_update_item_purchases.sql new file mode 100644 index 0000000..5dc500d --- /dev/null +++ b/Groceries.Data/Migrations/20230728185157_update_item_purchases.sql @@ -0,0 +1,14 @@ +CREATE OR REPLACE VIEW item_purchases AS +SELECT + item_id, + transaction_id, + created_at, + store_id, + price, + quantity, + CASE ROW_NUMBER() OVER (PARTITION BY item_id ORDER BY created_at DESC) + WHEN 1 THEN true + ELSE false + END AS is_last_purchase +FROM transaction_items +JOIN transactions USING (transaction_id); diff --git a/Groceries/Items/ItemsController.cs b/Groceries/Items/ItemsController.cs index 2252690..cecc20e 100644 --- a/Groceries/Items/ItemsController.cs +++ b/Groceries/Items/ItemsController.cs @@ -25,19 +25,11 @@ public class ItemsController : Controller itemsQuery = itemsQuery.Where(item => EF.Functions.ILike(item.Brand + ' ' + item.Name, searchPattern)); } - var lastPurchasesQuery = dbContext.ItemPurchases - .GroupBy(purchase => purchase.ItemId) - .Select(purchases => new - { - ItemId = purchases.Key, - CreatedAt = purchases.Max(purchase => purchase.CreatedAt), - }); - var items = await itemsQuery .OrderBy(item => item.Brand) .ThenBy(item => item.Name) .GroupJoin( - lastPurchasesQuery, + dbContext.ItemPurchases.Where(purchase => purchase.IsLastPurchase), item => item.Id, lastPurchase => lastPurchase.ItemId, (item, lastPurchase) => new { item, lastPurchase }) diff --git a/Groceries/Transactions/_TransactionItemForm.cshtml b/Groceries/Transactions/_TransactionItemForm.cshtml index 1c6ad6c..7e20f10 100644 --- a/Groceries/Transactions/_TransactionItemForm.cshtml +++ b/Groceries/Transactions/_TransactionItemForm.cshtml @@ -7,44 +7,61 @@ var items = await dbContext.Items .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 + { + group.item.Id, + group.item.Brand, + group.item.Name, + Price = lastPurchase != null ? lastPurchase.Price : (decimal?)null, + Quantity = lastPurchase != null ? lastPurchase.Quantity : (int?)null, + }) .ToArrayAsync(); var selectedItem = items.SingleOrDefault(item => item.Id == Model?.ItemId); } -