diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
index f4396301cb..eb88eac00a 100644
--- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
+++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.cs
@@ -2014,7 +2014,7 @@ public sealed class BaseItemRepository
if (filter.ArtistIds.Length > 0)
{
- baseQuery = baseQuery.WhereReferencedItem(context, ItemValueType.Artist, filter.ArtistIds);
+ baseQuery = baseQuery.WhereReferencedItemMultipleTypes(context, [ItemValueType.Artist, ItemValueType.AlbumArtist], filter.ArtistIds);
}
if (filter.AlbumArtistIds.Length > 0)
@@ -2024,7 +2024,18 @@ public sealed class BaseItemRepository
if (filter.ContributingArtistIds.Length > 0)
{
- baseQuery = baseQuery.WhereReferencedItem(context, ItemValueType.Artist, filter.ContributingArtistIds);
+ var contributingNames = context.BaseItems
+ .Where(b => filter.ContributingArtistIds.Contains(b.Id))
+ .Select(b => b.CleanName);
+
+ baseQuery = baseQuery.Where(e =>
+ e.ItemValues!.Any(ivm =>
+ ivm.ItemValue.Type == ItemValueType.Artist &&
+ contributingNames.Contains(ivm.ItemValue.CleanValue))
+ &&
+ !e.ItemValues!.Any(ivm =>
+ ivm.ItemValue.Type == ItemValueType.AlbumArtist &&
+ contributingNames.Contains(ivm.ItemValue.CleanValue)));
}
if (filter.AlbumIds.Length > 0)
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs b/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs
index 4d5cfb8c9b..8cb483f491 100644
--- a/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Implementations/JellyfinQueryHelperExtensions.cs
@@ -53,6 +53,33 @@ public static class JellyfinQueryHelperExtensions
return baseQuery.Where(ReferencedItemFilterExpressionBuilder(context, itemValueType, referenceIds, invert));
}
+ ///
+ /// Builds a query that checks referenced ItemValues for a cross BaseItem lookup.
+ ///
+ /// The source query.
+ /// The database context.
+ /// The type of item value to reference.
+ /// The list of BaseItem ids to check matches.
+ /// If set an exclusion check is performed instead.
+ /// A Query.
+ public static IQueryable WhereReferencedItemMultipleTypes(
+ this IQueryable baseQuery,
+ JellyfinDbContext context,
+ IList itemValueTypes,
+ IList referenceIds,
+ bool invert = false)
+ {
+ var itemFilter = OneOrManyExpressionBuilder(referenceIds, f => f.Id);
+
+ return baseQuery.Where(item =>
+ context.ItemValues
+ .Join(context.ItemValuesMap, e => e.ItemValueId, e => e.ItemValueId, (itemVal, map) => new { itemVal, map })
+ .Any(val =>
+ itemValueTypes.Contains(val.itemVal.Type)
+ && context.BaseItems.Where(itemFilter).Any(e => e.CleanName == val.itemVal.CleanValue)
+ && val.map.ItemId == item.Id) == EF.Constant(!invert));
+ }
+
///
/// Builds a query expression that checks referenced ItemValues for a cross BaseItem lookup.
///