Merge remote-tracking branch 'upstream/master' into fix-byname-queries
This commit is contained in:
@@ -1099,16 +1099,23 @@ public sealed partial class BaseItemRepository
|
||||
: baseQuery.WhereNeitherItemNorDescendantMatches(context, isPlaceHolder);
|
||||
}
|
||||
|
||||
// An extra is owned by the single version of an item it is named after, so an extra on any
|
||||
// version counts for the item itself
|
||||
IQueryable<Guid> WithPrimaryVersions(IQueryable<Guid> ownerIds)
|
||||
=> ownerIds.Concat(context.BaseItems
|
||||
.Where(version => version.PrimaryVersionId != null && ownerIds.Contains(version.Id))
|
||||
.Select(version => version.PrimaryVersionId!.Value));
|
||||
|
||||
if (filter.HasSpecialFeature.HasValue)
|
||||
{
|
||||
var itemsWithExtras = context.BaseItems
|
||||
var itemsWithExtras = WithPrimaryVersions(context.BaseItems
|
||||
.Where(extra => extra.OwnerId != null
|
||||
&& extra.ExtraType != null
|
||||
&& extra.ExtraType != BaseItemExtraType.Unknown
|
||||
&& extra.ExtraType != BaseItemExtraType.Trailer
|
||||
&& extra.ExtraType != BaseItemExtraType.ThemeSong
|
||||
&& extra.ExtraType != BaseItemExtraType.ThemeVideo)
|
||||
.Select(extra => extra.OwnerId!.Value)
|
||||
.Select(extra => extra.OwnerId!.Value))
|
||||
.Distinct();
|
||||
|
||||
Expression<Func<BaseItemEntity, bool>> hasExtras = e => itemsWithExtras.Contains(e.Id);
|
||||
@@ -1120,9 +1127,9 @@ public sealed partial class BaseItemRepository
|
||||
|
||||
if (filter.HasTrailer.HasValue)
|
||||
{
|
||||
var trailerOwnerIds = context.BaseItems
|
||||
var trailerOwnerIds = WithPrimaryVersions(context.BaseItems
|
||||
.Where(extra => extra.ExtraType == BaseItemExtraType.Trailer && extra.OwnerId != null)
|
||||
.Select(extra => extra.OwnerId!.Value);
|
||||
.Select(extra => extra.OwnerId!.Value));
|
||||
|
||||
Expression<Func<BaseItemEntity, bool>> hasTrailer = e => trailerOwnerIds.Contains(e.Id);
|
||||
|
||||
@@ -1133,9 +1140,9 @@ public sealed partial class BaseItemRepository
|
||||
|
||||
if (filter.HasThemeSong.HasValue)
|
||||
{
|
||||
var themeSongOwnerIds = context.BaseItems
|
||||
var themeSongOwnerIds = WithPrimaryVersions(context.BaseItems
|
||||
.Where(extra => extra.ExtraType == BaseItemExtraType.ThemeSong && extra.OwnerId != null)
|
||||
.Select(extra => extra.OwnerId!.Value);
|
||||
.Select(extra => extra.OwnerId!.Value));
|
||||
|
||||
Expression<Func<BaseItemEntity, bool>> hasThemeSong = e => themeSongOwnerIds.Contains(e.Id);
|
||||
|
||||
@@ -1146,9 +1153,9 @@ public sealed partial class BaseItemRepository
|
||||
|
||||
if (filter.HasThemeVideo.HasValue)
|
||||
{
|
||||
var themeVideoOwnerIds = context.BaseItems
|
||||
var themeVideoOwnerIds = WithPrimaryVersions(context.BaseItems
|
||||
.Where(extra => extra.ExtraType == BaseItemExtraType.ThemeVideo && extra.OwnerId != null)
|
||||
.Select(extra => extra.OwnerId!.Value);
|
||||
.Select(extra => extra.OwnerId!.Value));
|
||||
|
||||
Expression<Func<BaseItemEntity, bool>> hasThemeVideo = e => themeVideoOwnerIds.Contains(e.Id);
|
||||
|
||||
@@ -1175,33 +1182,6 @@ public sealed partial class BaseItemRepository
|
||||
}
|
||||
}
|
||||
|
||||
if (filter.AdjacentTo.HasValue && !filter.AdjacentTo.Value.IsEmpty())
|
||||
{
|
||||
var adjacentToId = filter.AdjacentTo.Value;
|
||||
var targetItem = context.BaseItems.Where(e => e.Id == adjacentToId).Select(e => new { e.SortName, e.Id }).FirstOrDefault();
|
||||
if (targetItem is not null)
|
||||
{
|
||||
var targetSortName = targetItem.SortName ?? string.Empty;
|
||||
|
||||
// Fetch both prev and next adjacent items in a single query using Concat (UNION ALL).
|
||||
var adjacentIds = context.BaseItems
|
||||
.Where(e => string.Compare(e.SortName, targetSortName) < 0)
|
||||
.OrderByDescending(e => e.SortName)
|
||||
.Select(e => e.Id)
|
||||
.Take(1)
|
||||
.Concat(
|
||||
context.BaseItems
|
||||
.Where(e => string.Compare(e.SortName, targetSortName) > 0)
|
||||
.OrderBy(e => e.SortName)
|
||||
.Select(e => e.Id)
|
||||
.Take(1))
|
||||
.ToList();
|
||||
|
||||
adjacentIds.Add(adjacentToId);
|
||||
baseQuery = baseQuery.Where(e => adjacentIds.Contains(e.Id));
|
||||
}
|
||||
}
|
||||
|
||||
return baseQuery;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user