Skip to content

Commit 4e822cc

Browse files
committed
Reenable use of SelectClauseVisitor for subqueries
1 parent 20ec240 commit 4e822cc

File tree

5 files changed

+31
-9
lines changed

5 files changed

+31
-9
lines changed

src/NHibernate.Test/Async/Linq/WhereTests.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -685,6 +685,19 @@ where sheet.Users.Select(x => x.NullableEnum2 ?? value).Contains(value)
685685
Assert.That(query.Count, Is.EqualTo(1));
686686
}
687687

688+
[Test]
689+
public async Task TimesheetsWithProjectionInSubqueryAsync()
690+
{
691+
if (Dialect is MsSqlCeDialect)
692+
Assert.Ignore("Dialect is not supported");
693+
694+
var query = await ((from sheet in db.Timesheets
695+
where sheet.Users.Select(x => new { Id = x.Id, Name = x.Name }).Any(x => x.Id == 1)
696+
select sheet).ToListAsync());
697+
698+
Assert.That(query.Count, Is.EqualTo(2));
699+
}
700+
688701
[Test]
689702
public async Task ContainsSubqueryWithCoalesceStringEnumSelectAsync()
690703
{

src/NHibernate.Test/Linq/WhereTests.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -686,6 +686,19 @@ where sheet.Users.Select(x => x.NullableEnum2 ?? value).Contains(value)
686686
Assert.That(query.Count, Is.EqualTo(1));
687687
}
688688

689+
[Test]
690+
public void TimesheetsWithProjectionInSubquery()
691+
{
692+
if (Dialect is MsSqlCeDialect)
693+
Assert.Ignore("Dialect is not supported");
694+
695+
var query = (from sheet in db.Timesheets
696+
where sheet.Users.Select(x => new { Id = x.Id, Name = x.Name }).Any(x => x.Id == 1)
697+
select sheet).ToList();
698+
699+
Assert.That(query.Count, Is.EqualTo(2));
700+
}
701+
689702
[Test]
690703
public void ContainsSubqueryWithCoalesceStringEnumSelect()
691704
{

src/NHibernate/Linq/Visitors/QueryModelVisitor.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -476,13 +476,9 @@ public override void VisitSelectClause(SelectClause selectClause, QueryModel que
476476

477477
private HqlSelect GetSelectClause(Expression selectClause)
478478
{
479-
if (!_root)
480-
return _hqlTree.TreeBuilder.Select(
481-
HqlGeneratorExpressionVisitor.Visit(selectClause, VisitorParameters).AsExpression());
482-
483479
var visitor = new SelectClauseVisitor(typeof(object[]), VisitorParameters);
484480

485-
visitor.VisitSelector(selectClause);
481+
visitor.VisitSelector(selectClause, !_root);
486482

487483
if (visitor.ProjectionExpression != null)
488484
{

src/NHibernate/Linq/Visitors/SelectClauseNominator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,13 @@ public SelectClauseHqlNominator(VisitorParameters parameters)
4343
_parameters = parameters;
4444
}
4545

46-
internal Expression Nominate(Expression expression)
46+
internal Expression Nominate(Expression expression, bool isSubQuery = false)
4747
{
4848
HqlCandidates = new HashSet<Expression>();
4949
ContainsUntranslatedMethodCalls = false;
5050
_canBeCandidate = true;
5151
_stateStack = new Stack<bool>();
52-
_stateStack.Push(false);
52+
_stateStack.Push(isSubQuery);
5353

5454
return Visit(expression);
5555
}

src/NHibernate/Linq/Visitors/SelectClauseVisitor.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public IEnumerable<HqlExpression> GetHqlNodes()
3434
return _hqlTreeNodes;
3535
}
3636

37-
public void VisitSelector(Expression expression)
37+
public void VisitSelector(Expression expression, bool isSubQuery = false)
3838
{
3939
var distinct = expression as NhDistinctExpression;
4040
if (distinct != null)
@@ -44,7 +44,7 @@ public void VisitSelector(Expression expression)
4444

4545
// Find the sub trees that can be expressed purely in HQL
4646
var nominator = new SelectClauseHqlNominator(_parameters);
47-
expression = nominator.Nominate(expression);
47+
expression = nominator.Nominate(expression, isSubQuery);
4848
_hqlNodes = nominator.HqlCandidates;
4949

5050
// Linq2SQL ignores calls to local methods. Linq2EF seems to not support

0 commit comments

Comments
 (0)