diff --git a/src/Marr.Data/QGen/QueryBuilder.cs b/src/Marr.Data/QGen/QueryBuilder.cs index d4cddf45f..ba135ac07 100644 --- a/src/Marr.Data/QGen/QueryBuilder.cs +++ b/src/Marr.Data/QGen/QueryBuilder.cs @@ -556,8 +556,14 @@ public virtual QueryBuilder Join(JoinType joinType, Expression _isJoin = true; MemberInfo rightMember = (rightEntity.Body as MemberExpression).Member; - var relationship = EntGraph.Relationships.Single(v => v.Member == rightMember); - EntGraph.AddLazyRelationship(relationship); + foreach (var item in EntGraph) + { + if (item.EntityType == typeof(TLeft)) + { + var relationship = item.Relationships.Single(v => v.Member == rightMember); + item.AddLazyRelationship(relationship); + } + } return Join(joinType, rightMember, filterExpression); } diff --git a/src/NzbDrone.Core.Test/Datastore/MarrDataLazyLoadingFixture.cs b/src/NzbDrone.Core.Test/Datastore/MarrDataLazyLoadingFixture.cs new file mode 100644 index 000000000..32aee7226 --- /dev/null +++ b/src/NzbDrone.Core.Test/Datastore/MarrDataLazyLoadingFixture.cs @@ -0,0 +1,105 @@ +using FizzWare.NBuilder; +using NUnit.Framework; +using NzbDrone.Core.Datastore; +using NzbDrone.Core.Test.Framework; +using NzbDrone.Core.Tv; +using NzbDrone.Core.Qualities; +using NzbDrone.Core.MediaFiles; + +namespace NzbDrone.Core.Test.Datastore +{ + + [TestFixture] + public class MarrDataLazyLoadingFixture : DbTest + { + [SetUp] + public void Setup() + { + var qualityProfile = new NzbDrone.Core.Qualities.QualityProfile + { + Name = "Test", + Cutoff = Quality.WEBDL720p, + Items = NzbDrone.Core.Test.Qualities.QualityFixture.GetDefaultQualities() + }; + + + qualityProfile = Db.Insert(qualityProfile); + + var series = Builder.CreateListOfSize(1) + .All() + .With(v => v.QualityProfileId = qualityProfile.Id) + .BuildListOfNew(); + + Db.InsertMany(series); + + var episodeFiles = Builder.CreateListOfSize(1) + .All() + .With(v => v.SeriesId = series[0].Id) + .BuildListOfNew(); + + Db.InsertMany(episodeFiles); + + var episodes = Builder.CreateListOfSize(10) + .All() + .With(v => v.Monitored = true) + .With(v => v.EpisodeFileId = episodeFiles[0].Id) + .With(v => v.SeriesId = series[0].Id) + .BuildListOfNew(); + + Db.InsertMany(episodes); + } + + [Test] + public void should_lazy_load_qualityprofile_if_not_joined() + { + var db = Mocker.Resolve(); + var DataMapper = db.GetDataMapper(); + + var episodes = DataMapper.Query() + .Join(Marr.Data.QGen.JoinType.Inner, v => v.Series, (l, r) => l.SeriesId == r.Id) + .ToList(); + + foreach (var episode in episodes) + { + Assert.IsNotNull(episode.Series); + Assert.IsFalse(episode.Series.QualityProfile.IsLoaded); + } + } + + [Test] + public void should_explicit_load_episodefile_if_joined() + { + var db = Mocker.Resolve(); + var DataMapper = db.GetDataMapper(); + + var episodes = DataMapper.Query() + .Join(Marr.Data.QGen.JoinType.Inner, v => v.EpisodeFile, (l, r) => l.EpisodeFileId == r.Id) + .ToList(); + + foreach (var episode in episodes) + { + Assert.IsNull(episode.Series); + Assert.IsTrue(episode.EpisodeFile.IsLoaded); + } + } + + [Test] + public void should_explicit_load_qualityprofile_if_joined() + { + var db = Mocker.Resolve(); + var DataMapper = db.GetDataMapper(); + + var episodes = DataMapper.Query() + .Join(Marr.Data.QGen.JoinType.Inner, v => v.Series, (l, r) => l.SeriesId == r.Id) + .Join(Marr.Data.QGen.JoinType.Inner, v => v.QualityProfile, (l, r) => l.QualityProfileId == r.Id) + .ToList(); + + foreach (var episode in episodes) + { + Assert.IsNotNull(episode.Series); + Assert.IsTrue(episode.Series.QualityProfile.IsLoaded); + } + } + + } +} \ No newline at end of file diff --git a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj index 15b3c68ab..3b03dfe3e 100644 --- a/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj +++ b/src/NzbDrone.Core.Test/NzbDrone.Core.Test.csproj @@ -104,6 +104,7 @@ +