Skip to content

Commit e9f6dd3

Browse files
committed
Fix GetTypeUsingProjection for multilevel criteria subqueries
Fixes #1312
1 parent b04f805 commit e9f6dd3

File tree

3 files changed

+49
-1
lines changed

3 files changed

+49
-1
lines changed

src/NHibernate.Test/Async/Criteria/Lambda/SubQueryIntegrationFixture.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,5 +166,29 @@ public async Task SubQueryAsync()
166166
Assert.That(nameAndChildCount[1].ChildCount, Is.EqualTo(1));
167167
}
168168
}
169+
170+
//NH-3493 - Cannot use alias between more than 1 level of nested queries
171+
[Test]
172+
public async Task ThreeLevelSubqueryAsync()
173+
{
174+
Person p = null;
175+
var detachedCriteria2 = DetachedCriteria.For<Person>("vf_inner_2")
176+
.SetProjection(Projections.Id())
177+
.Add(Restrictions.Eq($@"mk.{nameof(p.Age)}", 20))
178+
.Add(Restrictions.EqProperty("vf_inner_2.Id", "vf_inner.Id"));
179+
180+
var detachedCriteria1 = DetachedCriteria.For<Person>("vf_inner")
181+
.SetProjection(Projections.Id())
182+
.Add(Subqueries.Exists(detachedCriteria2))
183+
.Add(Restrictions.EqProperty("vf_inner.Id", "vf.Id"));
184+
185+
using (var s = OpenSession())
186+
{
187+
await (s.CreateCriteria<Person>("vf")
188+
.CreateAlias($"vf.{nameof(p.Father)}", "mk")
189+
.AddOrder(Order.Asc(Projections.SubQuery(detachedCriteria1)))
190+
.ListAsync<Person>());
191+
}
192+
}
169193
}
170194
}

src/NHibernate.Test/Criteria/Lambda/SubQueryIntegrationFixture.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,5 +155,29 @@ public void SubQuery()
155155
Assert.That(nameAndChildCount[1].ChildCount, Is.EqualTo(1));
156156
}
157157
}
158+
159+
//NH-3493 - Cannot use alias between more than 1 level of nested queries
160+
[Test]
161+
public void ThreeLevelSubquery()
162+
{
163+
Person p = null;
164+
var detachedCriteria2 = DetachedCriteria.For<Person>("vf_inner_2")
165+
.SetProjection(Projections.Id())
166+
.Add(Restrictions.Eq($@"mk.{nameof(p.Age)}", 20))
167+
.Add(Restrictions.EqProperty("vf_inner_2.Id", "vf_inner.Id"));
168+
169+
var detachedCriteria1 = DetachedCriteria.For<Person>("vf_inner")
170+
.SetProjection(Projections.Id())
171+
.Add(Subqueries.Exists(detachedCriteria2))
172+
.Add(Restrictions.EqProperty("vf_inner.Id", "vf.Id"));
173+
174+
using (var s = OpenSession())
175+
{
176+
s.CreateCriteria<Person>("vf")
177+
.CreateAlias($"vf.{nameof(p.Father)}", "mk")
178+
.AddOrder(Order.Asc(Projections.SubQuery(detachedCriteria1)))
179+
.List<Person>();
180+
}
181+
}
158182
}
159183
}

src/NHibernate/Loader/Criteria/CriteriaQueryTranslator.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@ public IType GetTypeUsingProjection(ICriteria subcriteria, string propertyName)
789789
}
790790
if (outerQueryTranslator != null)
791791
{
792-
return outerQueryTranslator.GetType(subcriteria, propertyName);
792+
return outerQueryTranslator.GetTypeUsingProjection(subcriteria, propertyName);
793793
}
794794
throw new QueryException("Could not find property " + propertyName);
795795
}

0 commit comments

Comments
 (0)