diff --git a/JobTrackerApi/Controllers/GmailController.cs b/JobTrackerApi/Controllers/GmailController.cs index 7383ba3..57ac4f9 100644 --- a/JobTrackerApi/Controllers/GmailController.cs +++ b/JobTrackerApi/Controllers/GmailController.cs @@ -641,12 +641,17 @@ public sealed class GmailController : ControllerBase var threadMessages = await _gmail.ListThreadMessagesAsync(ownerUserId, request.ThreadId.Trim(), cancellationToken); var distinctMessageIds = threadMessages.Select(message => message.Id).Where(static id => !string.IsNullOrWhiteSpace(id)).Distinct(StringComparer.Ordinal).ToList(); + // Batch the "already imported?" check with a single query instead of one + // AnyAsync per message (N+1), mirroring RelinkThread below. + var existingMessageIds = await _db.Correspondences + .Where(message => message.JobApplicationId == job.Id && message.ExternalMessageId != null && distinctMessageIds.Contains(message.ExternalMessageId)) + .Select(message => message.ExternalMessageId!) + .ToListAsync(cancellationToken); var imported = 0; var skipped = 0; foreach (var messageId in distinctMessageIds) { - var existing = await _db.Correspondences.AnyAsync(message => message.JobApplicationId == job.Id && message.ExternalMessageId == messageId, cancellationToken); - if (existing) + if (existingMessageIds.Contains(messageId, StringComparer.Ordinal)) { skipped++; continue;