diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH3288/FetchAndCollectionJoinFixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH3288/FetchAndCollectionJoinFixture.cs new file mode 100644 index 00000000000..0a1d6d97655 --- /dev/null +++ b/src/NHibernate.Test/Async/NHSpecificTest/GH3288/FetchAndCollectionJoinFixture.cs @@ -0,0 +1,58 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by AsyncGenerator. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + + +using System.Linq; +using NHibernate.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH3288 +{ + using System.Threading.Tasks; + [TestFixture] + public class FetchAndCollectionJoinFixtureAsync : BugTestCase + { + protected override void OnSetUp() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + var middleEntity = new MiddleEntity(); + middleEntity.Components.Add(new Component { MiddleEntity = middleEntity, Value = 1 }); + var te = new TopEntity + { + MiddleEntity = middleEntity + }; + session.Save(middleEntity); + session.Save(te); + + transaction.Commit(); + } + + protected override void OnTearDown() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + session.Delete("from System.Object"); + + transaction.Commit(); + } + + [Test] + public async Task ReuseEntityJoinWithCollectionJoinAsync() + { + using var session = OpenSession(); + + var entities = await (session.Query() + .Fetch(e => e.MiddleEntity) + .Where(e => e.MiddleEntity.Components.Any(e => e.Value != 0)) + .ToListAsync()); + Assert.That(entities.Count, Is.EqualTo(1)); + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3288/Entity.cs b/src/NHibernate.Test/NHSpecificTest/GH3288/Entity.cs new file mode 100644 index 00000000000..0e917134d11 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3288/Entity.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; + +namespace NHibernate.Test.NHSpecificTest.GH3288 +{ + class TopEntity + { + public virtual int Id { get; set; } + public virtual MiddleEntity MiddleEntity { get; set; } + } + class MiddleEntity + { + public virtual int Id { get; set; } + public virtual ISet Components { get; set; } = new HashSet(); + } + + class Component + { + public virtual MiddleEntity MiddleEntity { get; set; } + public virtual int Value { get; set; } + + public override bool Equals(object obj) + { + return (obj as Component)?.MiddleEntity.Id == MiddleEntity.Id; + } + + public override int GetHashCode() + { + return MiddleEntity.Id.GetHashCode(); + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3288/FetchAndCollectionJoinFixture.cs b/src/NHibernate.Test/NHSpecificTest/GH3288/FetchAndCollectionJoinFixture.cs new file mode 100644 index 00000000000..440c4f772bd --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3288/FetchAndCollectionJoinFixture.cs @@ -0,0 +1,47 @@ +using System.Linq; +using NHibernate.Linq; +using NUnit.Framework; + +namespace NHibernate.Test.NHSpecificTest.GH3288 +{ + [TestFixture] + public class FetchAndCollectionJoinFixture : BugTestCase + { + protected override void OnSetUp() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + var middleEntity = new MiddleEntity(); + middleEntity.Components.Add(new Component { MiddleEntity = middleEntity, Value = 1 }); + var te = new TopEntity + { + MiddleEntity = middleEntity + }; + session.Save(middleEntity); + session.Save(te); + + transaction.Commit(); + } + + protected override void OnTearDown() + { + using var session = OpenSession(); + using var transaction = session.BeginTransaction(); + session.Delete("from System.Object"); + + transaction.Commit(); + } + + [Test] + public void ReuseEntityJoinWithCollectionJoin() + { + using var session = OpenSession(); + + var entities = session.Query() + .Fetch(e => e.MiddleEntity) + .Where(e => e.MiddleEntity.Components.Any(e => e.Value != 0)) + .ToList(); + Assert.That(entities.Count, Is.EqualTo(1)); + } + } +} diff --git a/src/NHibernate.Test/NHSpecificTest/GH3288/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH3288/Mappings.hbm.xml new file mode 100644 index 00000000000..94ca5e12a95 --- /dev/null +++ b/src/NHibernate.Test/NHSpecificTest/GH3288/Mappings.hbm.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs b/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs index 2b2423d85bb..0982c4fdaee 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/HqlSqlWalker.cs @@ -527,7 +527,7 @@ internal string GetEntitySuffix(FromElement fromElement) internal string GetCollectionSuffix(FromElement fromElement) { - if (!fromElement.CollectionJoin && fromElement.QueryableCollection == null) + if (fromElement.QueryableCollection == null) { return null; }