Skip to content

Commit ff5b845

Browse files
Merge 5.4.6 in master
2 parents 98bd644 + ccff784 commit ff5b845

File tree

6 files changed

+52
-12
lines changed

6 files changed

+52
-12
lines changed

releasenotes.txt

+19-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,20 @@
1-
Build 5.4.5
1+
Build 5.4.6
2+
=============================
3+
4+
Release notes - NHibernate - Version 5.4.6
5+
6+
2 issues were resolved in this release.
7+
8+
** Bug
9+
10+
* #3414 Reenable use of SelectClauseVisitor for subqueries
11+
12+
** Task
13+
14+
* #3419 Release 5.4.6
15+
16+
17+
Build 5.4.5
218
=============================
319

420
Release notes - NHibernate - Version 5.4.5
@@ -7,8 +23,8 @@ Release notes - NHibernate - Version 5.4.5
723

824
** Task
925

10-
* #3408 Release 5.4.4
11-
* #3407 Release Merge 5.3.19 in 5.4.x
26+
* #3408 Release 5.4.5
27+
* #3407 Merge 5.3.19 in 5.4.x
1228

1329

1430
Build 5.4.4

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

+13
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

+13
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

+1-5
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

+2-2
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

+4-2
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ public IEnumerable<HqlExpression> GetHqlNodes()
3434
return _hqlTreeNodes;
3535
}
3636

37-
public void VisitSelector(Expression expression)
37+
public void VisitSelector(Expression expression) => VisitSelector(expression, false);
38+
39+
public void VisitSelector(Expression expression, bool isSubQuery)
3840
{
3941
var distinct = expression as NhDistinctExpression;
4042
if (distinct != null)
@@ -44,7 +46,7 @@ public void VisitSelector(Expression expression)
4446

4547
// Find the sub trees that can be expressed purely in HQL
4648
var nominator = new SelectClauseHqlNominator(_parameters);
47-
expression = nominator.Nominate(expression);
49+
expression = nominator.Nominate(expression, isSubQuery);
4850
_hqlNodes = nominator.HqlCandidates;
4951

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

0 commit comments

Comments
 (0)