diff --git a/src/NHibernate.Test/Async/Linq/ByMethod/JoinTests.cs b/src/NHibernate.Test/Async/Linq/ByMethod/JoinTests.cs index fd3468c6980..987ed002f60 100644 --- a/src/NHibernate.Test/Async/Linq/ByMethod/JoinTests.cs +++ b/src/NHibernate.Test/Async/Linq/ByMethod/JoinTests.cs @@ -140,5 +140,13 @@ from o2 in db.Orders.Where(x => x.Freight > 50) Assert.That(GetTotalOccurrences(sql, "inner join"), Is.EqualTo(useCrossJoin ? 0 : 1)); } } + + [Test] + public async Task CanJoinOnEntityWithSubclassesAsync() + { + var result = await ((from o in db.Animals + from o2 in db.Animals.Where(x => x.BodyWeight > 50) + select new {o, o2}).Take(1).ToListAsync()); + } } } diff --git a/src/NHibernate.Test/Linq/ByMethod/JoinTests.cs b/src/NHibernate.Test/Linq/ByMethod/JoinTests.cs index d1dc10bec83..8dce4d39223 100644 --- a/src/NHibernate.Test/Linq/ByMethod/JoinTests.cs +++ b/src/NHibernate.Test/Linq/ByMethod/JoinTests.cs @@ -129,5 +129,13 @@ from o2 in db.Orders.Where(x => x.Freight > 50) Assert.That(GetTotalOccurrences(sql, "inner join"), Is.EqualTo(useCrossJoin ? 0 : 1)); } } + + [Test] + public void CanJoinOnEntityWithSubclasses() + { + var result = (from o in db.Animals + from o2 in db.Animals.Where(x => x.BodyWeight > 50) + select new {o, o2}).Take(1).ToList(); + } } } diff --git a/src/NHibernate/Engine/JoinSequence.cs b/src/NHibernate/Engine/JoinSequence.cs index 12520798f46..ddd68a3dd17 100644 --- a/src/NHibernate/Engine/JoinSequence.cs +++ b/src/NHibernate/Engine/JoinSequence.cs @@ -249,7 +249,7 @@ private bool IsIncluded(string alias) return selector != null && selector.IncludeSubclasses(alias); } - private void AddExtraJoins(JoinFragment joinFragment, string alias, IJoinable joinable, bool innerJoin) + private protected void AddExtraJoins(JoinFragment joinFragment, string alias, IJoinable joinable, bool innerJoin) { bool include = IsIncluded(alias); joinFragment.AddJoins(joinable.FromJoinFragment(alias, innerJoin, include), diff --git a/src/NHibernate/Hql/Ast/ANTLR/Tree/EntityJoinJoinSequenceImpl.cs b/src/NHibernate/Hql/Ast/ANTLR/Tree/EntityJoinJoinSequenceImpl.cs index 99d7d69e54b..430515223d0 100644 --- a/src/NHibernate/Hql/Ast/ANTLR/Tree/EntityJoinJoinSequenceImpl.cs +++ b/src/NHibernate/Hql/Ast/ANTLR/Tree/EntityJoinJoinSequenceImpl.cs @@ -41,6 +41,10 @@ internal override JoinFragment ToJoinFragment( // on.Append(" and ").Append(filters); // } joinFragment.AddJoin(_tableName, _tableAlias, Array.Empty(), Array.Empty(), _joinType, on); + if (includeExtraJoins) + { + AddExtraJoins(joinFragment, _tableAlias, _entityType.GetAssociatedJoinable(Factory), _joinType == JoinType.InnerJoin); + } return joinFragment; } }