diff --git a/Marco.Pms.Model/Expenses/Expenses.cs b/Marco.Pms.Model/Expenses/Expenses.cs index 7a48485..23d3fc9 100644 --- a/Marco.Pms.Model/Expenses/Expenses.cs +++ b/Marco.Pms.Model/Expenses/Expenses.cs @@ -17,7 +17,6 @@ namespace Marco.Pms.Model.Expenses public ICollection Attachments { get; set; } = new List(); public ICollection ExpensesReimburseMappings { get; set; } = new List(); - public ICollection ExpenseLogs { get; set; } = new List(); public Guid ExpenseCategoryId { get; set; } diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index 6f76f07..6b72397 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -528,9 +528,6 @@ namespace Marco.Pms.Services.Service .ThenInclude(erm => erm.ExpensesReimburse) .ThenInclude(er => er!.ReimburseBy) .ThenInclude(e => e!.JobRole) - .Include(e => e.ExpenseLogs) - .ThenInclude(el => el.UpdatedBy) - .ThenInclude(e => e!.JobRole) .FirstOrDefaultAsync(e => (e.Id == id || (e.UIDPrefix + "/" + e.UIDPostfix.ToString().PadLeft(5, '0')) == expenseUId) && e.TenantId == tenantId); @@ -563,6 +560,15 @@ namespace Marco.Pms.Services.Service var projectVm = await GetProjectDetailsAsync(expense.ProjectId, tenantId); response.Project = projectVm; + response.ExpenseLogs = await _context.ExpenseLogs + .AsNoTracking() // Read-only query optimization + .Include(el => el.UpdatedBy) + .ThenInclude(e => e!.JobRole) + .Where(el => el.ExpenseId == expense.Id) + .OrderByDescending(el => el.UpdateAt) + .ProjectTo(_mapper.ConfigurationProvider) // Projection + .ToListAsync(); + // 9. Generate S3 Pre-signed URLs for attachments response.Documents = expense.Attachments .Where(ba => ba.Document != null)