Refactor query from EXISTS to JOIN to avoid API timeouts with large libraries (#14557)

This commit is contained in:
evan314159 2025-08-12 03:05:13 +08:00 committed by GitHub
parent cd1d11366e
commit 47634e731a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -1115,13 +1115,18 @@ public sealed class BaseItemRepository
IsSeries = filter.IsSeries
});
var itemValuesQuery = context.ItemValues
.Where(f => itemValueTypes.Contains(f.Type))
.SelectMany(f => f.BaseItemsMap!, (f, w) => new { f, w })
.Join(
innerQueryFilter,
fw => fw.w.ItemId,
g => g.Id,
(fw, g) => fw.f.CleanValue);
var innerQuery = PrepareItemQuery(context, filter)
.Where(e => e.Type == returnType)
.Where(e => context.ItemValues!
.Where(f => itemValueTypes.Contains(f.Type))
.Where(f => innerQueryFilter.Any(g => f.BaseItemsMap!.Any(w => w.ItemId == g.Id)))
.Select(f => f.CleanValue)
.Contains(e.CleanName));
.Where(e => itemValuesQuery.Contains(e.CleanName));
var outerQueryFilter = new InternalItemsQuery(filter.User)
{