From d19449e6a5d66bc37ade831dd96a85152e98a533 Mon Sep 17 00:00:00 2001 From: Shadowghost Date: Sun, 26 Apr 2026 17:59:16 +0200 Subject: [PATCH] Use AsNoTracking() when only reading --- .../Item/BaseItemRepository.ByName.cs | 2 +- .../Item/BaseItemRepository.QueryBuilding.cs | 11 ++++++----- .../Item/BaseItemRepository.Querying.cs | 2 +- .../Item/LinkedChildrenService.cs | 4 +++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.ByName.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.ByName.cs index c4464008d4..380c6e582c 100644 --- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.ByName.cs +++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.ByName.cs @@ -197,7 +197,7 @@ public sealed partial class BaseItemRepository var masterIds = orderedMasterQuery.ToList(); var query = ApplyNavigations( - context.BaseItems.AsSingleQuery().Where(e => masterIds.Contains(e.Id)), + context.BaseItems.AsNoTracking().AsSingleQuery().Where(e => masterIds.Contains(e.Id)), filter); query = ApplyOrder(query, filter, context); diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.QueryBuilding.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.QueryBuilding.cs index 02664621d4..a1f02be059 100644 --- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.QueryBuilding.cs +++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.QueryBuilding.cs @@ -69,17 +69,17 @@ public sealed partial class BaseItemRepository if (enableGroupByPresentationUniqueKey && filter.GroupBySeriesPresentationUniqueKey) { var groupedIds = dbQuery.GroupBy(e => new { e.PresentationUniqueKey, e.SeriesPresentationUniqueKey }).Select(e => e.Min(x => x.Id)); - dbQuery = context.BaseItems.Where(e => groupedIds.Contains(e.Id)); + dbQuery = context.BaseItems.AsNoTracking().Where(e => groupedIds.Contains(e.Id)); } else if (enableGroupByPresentationUniqueKey) { var groupedIds = dbQuery.GroupBy(e => e.PresentationUniqueKey).Select(e => e.Min(x => x.Id)); - dbQuery = context.BaseItems.Where(e => groupedIds.Contains(e.Id)); + dbQuery = context.BaseItems.AsNoTracking().Where(e => groupedIds.Contains(e.Id)); } else if (filter.GroupBySeriesPresentationUniqueKey) { var groupedIds = dbQuery.GroupBy(e => e.SeriesPresentationUniqueKey).Select(e => e.Min(x => x.Id)); - dbQuery = context.BaseItems.Where(e => groupedIds.Contains(e.Id)); + dbQuery = context.BaseItems.AsNoTracking().Where(e => groupedIds.Contains(e.Id)); } else { @@ -142,7 +142,7 @@ public sealed partial class BaseItemRepository .Distinct(); var collapsedIds = nonCollapsibleIds.Union(collapsibleNotInBoxSet).Union(boxSetIds); - return context.BaseItems.Where(e => collapsedIds.Contains(e.Id)); + return context.BaseItems.AsNoTracking().Where(e => collapsedIds.Contains(e.Id)); } private static IQueryable ApplyBoxSetCollapsingAll( @@ -169,7 +169,7 @@ public sealed partial class BaseItemRepository .Distinct(); var collapsedIds = notInBoxSet.Union(boxSetIds); - return context.BaseItems.Where(e => collapsedIds.Contains(e.Id)); + return context.BaseItems.AsNoTracking().Where(e => collapsedIds.Contains(e.Id)); } private static IQueryable ApplyNameFilters(IQueryable dbQuery, InternalItemsQuery filter) @@ -368,6 +368,7 @@ public sealed partial class BaseItemRepository var allDescendantIds = DescendantQueryHelper.GetAllDescendantIds(context, ancestorId); var baseQuery = context.BaseItems + .AsNoTracking() .Where(b => allDescendantIds.Contains(b.Id) && !b.IsFolder && !b.IsVirtualItem); return ApplyAccessFiltering(context, baseQuery, filter); diff --git a/Jellyfin.Server.Implementations/Item/BaseItemRepository.Querying.cs b/Jellyfin.Server.Implementations/Item/BaseItemRepository.Querying.cs index 7ca3559324..69c8a3b811 100644 --- a/Jellyfin.Server.Implementations/Item/BaseItemRepository.Querying.cs +++ b/Jellyfin.Server.Implementations/Item/BaseItemRepository.Querying.cs @@ -87,7 +87,7 @@ public sealed partial class BaseItemRepository return Array.Empty(); } - var itemsById = ApplyNavigations(context.BaseItems.Where(e => orderedIds.Contains(e.Id)), filter) + var itemsById = ApplyNavigations(context.BaseItems.AsNoTracking().Where(e => orderedIds.Contains(e.Id)), filter) .AsSplitQuery() .AsEnumerable() .Select(w => DeserializeBaseItem(w, filter.SkipDeserialization)) diff --git a/Jellyfin.Server.Implementations/Item/LinkedChildrenService.cs b/Jellyfin.Server.Implementations/Item/LinkedChildrenService.cs index 19afe04f01..4d27cae218 100644 --- a/Jellyfin.Server.Implementations/Item/LinkedChildrenService.cs +++ b/Jellyfin.Server.Implementations/Item/LinkedChildrenService.cs @@ -62,7 +62,9 @@ public class LinkedChildrenService : ILinkedChildrenService { using var dbContext = _dbProvider.CreateDbContext(); - var artists = dbContext.BaseItems.Where(e => e.Type == _itemTypeLookup.BaseItemKindNames[BaseItemKind.MusicArtist]!) + var artists = dbContext.BaseItems + .AsNoTracking() + .Where(e => e.Type == _itemTypeLookup.BaseItemKindNames[BaseItemKind.MusicArtist]!) .Where(e => artistNames.Contains(e.Name)) .ToArray();