Fix only returning one item from /Item/Latest api. (#12492)

* Updated to EFcore

* Remove unused using

* Dont use DateCreated not from episode type or music type

* use TranslateQuery to filter out instead and then do the grouping and retrival of min and max datecreated instead

* Album also
This commit is contained in:
JQ
2025-03-27 10:26:47 +08:00
committed by GitHub
parent cafb7cd002
commit d06ce1f1e0
5 changed files with 90 additions and 0 deletions

View File

@@ -264,6 +264,48 @@ public sealed class BaseItemRepository
return dbQuery.AsEnumerable().Where(e => e is not null).Select(w => DeserialiseBaseItem(w, filter.SkipDeserialization)).ToArray();
}
/// <inheritdoc/>
public IReadOnlyList<BaseItem> GetLatestItemList(InternalItemsQuery filter, CollectionType collectionType)
{
ArgumentNullException.ThrowIfNull(filter);
PrepareFilterQuery(filter);
// Early exit if collection type is not tvshows or music
if (collectionType != CollectionType.tvshows && collectionType != CollectionType.music)
{
return Array.Empty<BaseItem>();
}
using var context = _dbProvider.CreateDbContext();
// Subquery to group by SeriesNames/Album and get the max Date Created for each group.
var subquery = PrepareItemQuery(context, filter);
subquery = TranslateQuery(subquery, context, filter);
var subqueryGrouped = subquery.GroupBy(g => collectionType == CollectionType.tvshows ? g.SeriesName : g.Album)
.Select(g => new
{
Key = g.Key,
MaxDateCreated = g.Max(a => a.DateCreated)
})
.OrderByDescending(g => g.MaxDateCreated)
.Select(g => g);
if (filter.Limit.HasValue)
{
subqueryGrouped = subqueryGrouped.Take(filter.Limit.Value);
}
filter.Limit = null;
var mainquery = PrepareItemQuery(context, filter);
mainquery = TranslateQuery(mainquery, context, filter);
mainquery = mainquery.Where(g => g.DateCreated >= subqueryGrouped.Min(s => s.MaxDateCreated));
mainquery = ApplyGroupingFilter(mainquery, filter);
mainquery = ApplyQueryPaging(mainquery, filter);
return mainquery.AsEnumerable().Where(e => e is not null).Select(w => DeserialiseBaseItem(w, filter.SkipDeserialization)).ToArray();
}
/// <inheritdoc />
public IReadOnlyList<string> GetNextUpSeriesKeys(InternalItemsQuery filter, DateTime dateCutoff)
{