Skip to content

Commit dbc4485

Browse files
committed
Use proper inner join in Linq instead of cross-join and where clauses
1 parent 11bc49d commit dbc4485

File tree

3 files changed

+32
-8
lines changed

3 files changed

+32
-8
lines changed

Diff for: src/NHibernate/Hql/Ast/HqlTreeBuilder.cs

+5
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,11 @@ public HqlJoin Join(HqlExpression expression, HqlAlias @alias)
363363
return new HqlJoin(_factory, expression, @alias);
364364
}
365365

366+
public HqlInnerJoin InnerJoin(HqlExpression expression, HqlAlias @alias)
367+
{
368+
return new HqlInnerJoin(_factory, expression, @alias);
369+
}
370+
366371
public HqlAny Any()
367372
{
368373
return new HqlAny(_factory);

Diff for: src/NHibernate/Hql/Ast/HqlTreeNode.cs

+18-1
Original file line numberDiff line numberDiff line change
@@ -822,9 +822,18 @@ public HqlJoin(IASTFactory factory, HqlExpression expression, HqlAlias @alias) :
822822
}
823823
}
824824

825+
public class HqlInnerJoin : HqlTreeNode
826+
{
827+
public HqlInnerJoin(IASTFactory factory, HqlExpression expression, HqlAlias @alias)
828+
: base(HqlSqlWalker.JOIN, "join", factory, new HqlInner(factory), expression, @alias)
829+
{
830+
}
831+
}
832+
825833
public class HqlLeftJoin : HqlTreeNode
826834
{
827-
public HqlLeftJoin(IASTFactory factory, HqlExpression expression, HqlAlias @alias) : base(HqlSqlWalker.JOIN, "join", factory, new HqlLeft(factory), expression, @alias)
835+
public HqlLeftJoin(IASTFactory factory, HqlExpression expression, HqlAlias @alias)
836+
: base(HqlSqlWalker.JOIN, "join", factory, new HqlLeft(factory), expression, @alias)
828837
{
829838
}
830839
}
@@ -876,6 +885,14 @@ public HqlBitwiseAnd(IASTFactory factory, HqlExpression lhs, HqlExpression rhs)
876885
}
877886
}
878887

888+
public class HqlInner : HqlTreeNode
889+
{
890+
public HqlInner(IASTFactory factory)
891+
: base(HqlSqlWalker.LEFT, "inner", factory)
892+
{
893+
}
894+
}
895+
879896
public class HqlLeft : HqlTreeNode
880897
{
881898
public HqlLeft(IASTFactory factory)

Diff for: src/NHibernate/Linq/Visitors/QueryModelVisitor.cs

+9-7
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ public override void VisitNhJoinClause(NhJoinClause joinClause, QueryModel query
346346
HqlTreeNode hqlJoin;
347347
if (joinClause.IsInner)
348348
{
349-
hqlJoin = _hqlTree.TreeBuilder.Join(expression, alias);
349+
hqlJoin = _hqlTree.TreeBuilder.InnerJoin(expression, alias);
350350
}
351351
else
352352
{
@@ -497,15 +497,17 @@ public override void VisitOrderByClause(OrderByClause orderByClause, QueryModel
497497

498498
public override void VisitJoinClause(JoinClause joinClause, QueryModel queryModel, int index)
499499
{
500+
var querySourceName = VisitorParameters.QuerySourceNamer.GetName(joinClause);
500501
var equalityVisitor = new EqualityHqlGenerator(VisitorParameters);
501502
var whereClause = equalityVisitor.Visit(joinClause.InnerKeySelector, joinClause.OuterKeySelector);
502503

503-
_hqlTree.AddWhereClause(whereClause);
504-
505-
_hqlTree.AddFromClause(
506-
_hqlTree.TreeBuilder.Range(
507-
HqlGeneratorExpressionVisitor.Visit(joinClause.InnerSequence, VisitorParameters),
508-
_hqlTree.TreeBuilder.Alias(joinClause.ItemName)));
504+
var expression = HqlGeneratorExpressionVisitor.Visit(joinClause.InnerSequence, VisitorParameters).AsExpression();
505+
var hqlJoin = _hqlTree.TreeBuilder.InnerJoin(
506+
expression,
507+
_hqlTree.TreeBuilder.Alias(querySourceName)
508+
);
509+
hqlJoin.AddChild(_hqlTree.TreeBuilder.With(whereClause.ToBooleanExpression()));
510+
_hqlTree.AddFromClause(hqlJoin);
509511
}
510512

511513
public override void VisitGroupJoinClause(GroupJoinClause groupJoinClause, QueryModel queryModel, int index)

0 commit comments

Comments
 (0)