diff --git a/src/NzbDrone.Core/Music/Repositories/AlbumRepository.cs b/src/NzbDrone.Core/Music/Repositories/AlbumRepository.cs index 3c69cf42b..012a8b8b6 100644 --- a/src/NzbDrone.Core/Music/Repositories/AlbumRepository.cs +++ b/src/NzbDrone.Core/Music/Repositories/AlbumRepository.cs @@ -90,22 +90,26 @@ namespace NzbDrone.Core.Music return Query(s => s.ForeignAlbumId == foreignAlbumId).SingleOrDefault(); } - // x.Id == null is converted to SQL, so warning incorrect -#pragma warning disable CS0472 private SqlBuilder AlbumsWithoutFilesBuilder(DateTime currentTime) { + // First, create a subquery to find albums with missing tracks + var missingTracksSubquery = Builder() + .Select("\"AlbumReleases\".\"AlbumId\"") + .Join((r, t) => r.Id == t.AlbumReleaseId) + .LeftJoin((t, f) => t.TrackFileId == f.Id) + .Where(f => f == null) + .Where(r => r.Monitored == true) + .GroupBy("\"AlbumReleases\".\"AlbumId\""); + + // Main query that joins with the subquery return Builder() - .Join((l, r) => l.ArtistMetadataId == r.ArtistMetadataId) - .Join((a, r) => a.Id == r.AlbumId) - .Join((r, t) => r.Id == t.AlbumReleaseId) - .LeftJoin((t, f) => t.TrackFileId == f.Id) - .Where(f => f.Id == null) - .Where(r => r.Monitored == true) - .Where(a => a.ReleaseDate <= currentTime) - .GroupBy(x => x.Id) - .GroupBy(x => x.SortName); + .Join((l, r) => l.ArtistMetadataId == r.ArtistMetadataId) + .Where(a => a.Monitored == true && a.ReleaseDate <= currentTime) + .Where(a => a.Monitored == true) + .Where("\"Albums\".\"Id\" IN (SELECT \"AlbumReleases\".\"AlbumId\" FROM \"AlbumReleases\" JOIN \"Tracks\" ON (\"AlbumReleases\".\"Id\" = \"Tracks\".\"AlbumReleaseId\") LEFT JOIN \"TrackFiles\" ON (\"Tracks\".\"TrackFileId\" = \"TrackFiles\".\"Id\") WHERE \"TrackFiles\" IS NULL AND \"AlbumReleases\".\"Monitored\" = true GROUP BY \"AlbumReleases\".\"AlbumId\")") + .GroupBy(x => x.Id) + .GroupBy(x => x.SortName); } -#pragma warning restore CS0472 public PagingSpec AlbumsWithoutFiles(PagingSpec pagingSpec) {