Skip to content

Commit 45ff1cf

Browse files
committed
Make previously HQL:ed expressions automatic candidates in SELECT
1 parent 0c9e442 commit 45ff1cf

File tree

2 files changed

+11
-6
lines changed

2 files changed

+11
-6
lines changed

src/NHibernate/Linq/Visitors/QueryModelVisitor.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ public static ExpressionToHqlTranslationResults GenerateHqlQuery(QueryModel quer
111111
}
112112

113113
private readonly IntermediateHqlTree _hqlTree;
114+
private readonly HashSet<Expression> _hqlCandidates;
114115
private readonly NhLinqExpressionReturnType? _rootReturnType;
115116
private static readonly ResultOperatorMap ResultOperatorMap;
116117
private bool _serverSide = true;
@@ -165,6 +166,7 @@ private QueryModelVisitor(VisitorParameters visitorParameters, bool root, QueryM
165166
_root = root;
166167
_rootReturnType = root ? rootReturnType : null;
167168
_hqlTree = new IntermediateHqlTree(root, _queryMode);
169+
_hqlCandidates = new HashSet<Expression>();
168170
}
169171

170172
private void Visit()
@@ -476,7 +478,7 @@ public override void VisitSelectClause(SelectClause selectClause, QueryModel que
476478

477479
private HqlSelect GetSelectClause(Expression selectClause)
478480
{
479-
var visitor = new SelectClauseVisitor(typeof(object[]), VisitorParameters);
481+
var visitor = new SelectClauseVisitor(typeof(object[]), VisitorParameters, _hqlCandidates);
480482

481483
visitor.VisitSelector(selectClause, !_root);
482484

@@ -537,7 +539,7 @@ private void VisitDeleteClause(Expression expression)
537539
return;
538540

539541
// We only need to check there is no unexpected select, for avoiding silently ignoring them.
540-
var visitor = new SelectClauseVisitor(typeof(object[]), VisitorParameters);
542+
var visitor = new SelectClauseVisitor(typeof(object[]), VisitorParameters, new HashSet<Expression>());
541543
visitor.VisitSelector(expression);
542544

543545
if (visitor.ProjectionExpression != null)
@@ -566,6 +568,7 @@ public override void VisitOrderByClause(OrderByClause orderByClause, QueryModel
566568
: (HqlDirectionStatement)_hqlTree.TreeBuilder.Descending();
567569

568570
_hqlTree.AddOrderByClause(orderBy, direction);
571+
_hqlCandidates.Add(clause.Expression);
569572
}
570573
}
571574

src/NHibernate/Linq/Visitors/SelectClauseVisitor.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@ public class SelectClauseVisitor : RelinqExpressionVisitor
1616
private HashSet<Expression> _hqlNodes;
1717
private readonly ParameterExpression _inputParameter;
1818
private readonly VisitorParameters _parameters;
19+
private readonly HashSet<Expression> _hqlCandidates;
1920
private int _iColumn;
2021
private List<HqlExpression> _hqlTreeNodes = new List<HqlExpression>();
2122
private readonly HqlGeneratorExpressionVisitor _hqlVisitor;
2223

23-
public SelectClauseVisitor(System.Type inputType, VisitorParameters parameters)
24+
public SelectClauseVisitor(System.Type inputType, VisitorParameters parameters, HashSet<Expression> hqlCandidates)
2425
{
2526
_inputParameter = Expression.Parameter(inputType, "input");
2627
_parameters = parameters;
28+
_hqlCandidates = hqlCandidates;
2729
_hqlVisitor = new HqlGeneratorExpressionVisitor(_parameters);
2830
}
2931

@@ -69,9 +71,9 @@ public void VisitSelector(Expression expression, bool isSubQuery)
6971

7072
if (distinct != null)
7173
{
72-
var treeNodes = new List<HqlTreeNode>(_hqlTreeNodes.Count + 1) {_hqlTreeBuilder.Distinct()};
74+
var treeNodes = new List<HqlTreeNode>(_hqlTreeNodes.Count + 1) { _hqlTreeBuilder.Distinct() };
7375
treeNodes.AddRange(_hqlTreeNodes);
74-
_hqlTreeNodes = new List<HqlExpression>(1) {_hqlTreeBuilder.ExpressionSubTreeHolder(treeNodes)};
76+
_hqlTreeNodes = new List<HqlExpression>(1) { _hqlTreeBuilder.ExpressionSubTreeHolder(treeNodes) };
7577
}
7678
}
7779

@@ -82,7 +84,7 @@ public override Expression Visit(Expression expression)
8284
return null;
8385
}
8486

85-
if (_hqlNodes.Contains(expression))
87+
if (_hqlNodes.Contains(expression) || _hqlCandidates.Contains(expression))
8688
{
8789
// Pure HQL evaluation
8890
_hqlTreeNodes.Add(_hqlVisitor.Visit(expression).AsExpression());

0 commit comments

Comments
 (0)