diff --git a/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs b/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs index 49cad7607e1..542883bb8d3 100755 --- a/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs +++ b/src/NHibernate/Hql/Ast/HqlTreeBuilder.cs @@ -363,6 +363,11 @@ public HqlJoin Join(HqlExpression expression, HqlAlias @alias) return new HqlJoin(_factory, expression, @alias); } + public HqlInnerJoin InnerJoin(HqlExpression expression, HqlAlias @alias) + { + return new HqlInnerJoin(_factory, expression, @alias); + } + public HqlAny Any() { return new HqlAny(_factory); diff --git a/src/NHibernate/Hql/Ast/HqlTreeNode.cs b/src/NHibernate/Hql/Ast/HqlTreeNode.cs index 7289d5acbc5..255fce43de7 100755 --- a/src/NHibernate/Hql/Ast/HqlTreeNode.cs +++ b/src/NHibernate/Hql/Ast/HqlTreeNode.cs @@ -822,9 +822,18 @@ public HqlJoin(IASTFactory factory, HqlExpression expression, HqlAlias @alias) : } } + public class HqlInnerJoin : HqlTreeNode + { + public HqlInnerJoin(IASTFactory factory, HqlExpression expression, HqlAlias @alias) + : base(HqlSqlWalker.JOIN, "join", factory, new HqlInner(factory), expression, @alias) + { + } + } + public class HqlLeftJoin : HqlTreeNode { - public HqlLeftJoin(IASTFactory factory, HqlExpression expression, HqlAlias @alias) : base(HqlSqlWalker.JOIN, "join", factory, new HqlLeft(factory), expression, @alias) + public HqlLeftJoin(IASTFactory factory, HqlExpression expression, HqlAlias @alias) + : base(HqlSqlWalker.JOIN, "join", factory, new HqlLeft(factory), expression, @alias) { } } @@ -876,6 +885,14 @@ public HqlBitwiseAnd(IASTFactory factory, HqlExpression lhs, HqlExpression rhs) } } + public class HqlInner : HqlTreeNode + { + public HqlInner(IASTFactory factory) + : base(HqlSqlWalker.INNER, "inner", factory) + { + } + } + public class HqlLeft : HqlTreeNode { public HqlLeft(IASTFactory factory) diff --git a/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs b/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs index 1a87c9705a1..cf2ca61b07f 100644 --- a/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs +++ b/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs @@ -346,7 +346,7 @@ public override void VisitNhJoinClause(NhJoinClause joinClause, QueryModel query HqlTreeNode hqlJoin; if (joinClause.IsInner) { - hqlJoin = _hqlTree.TreeBuilder.Join(expression, alias); + hqlJoin = _hqlTree.TreeBuilder.InnerJoin(expression, alias); } else { @@ -497,15 +497,17 @@ public override void VisitOrderByClause(OrderByClause orderByClause, QueryModel public override void VisitJoinClause(JoinClause joinClause, QueryModel queryModel, int index) { + var querySourceName = VisitorParameters.QuerySourceNamer.GetName(joinClause); var equalityVisitor = new EqualityHqlGenerator(VisitorParameters); var whereClause = equalityVisitor.Visit(joinClause.InnerKeySelector, joinClause.OuterKeySelector); - _hqlTree.AddWhereClause(whereClause); - - _hqlTree.AddFromClause( - _hqlTree.TreeBuilder.Range( - HqlGeneratorExpressionVisitor.Visit(joinClause.InnerSequence, VisitorParameters), - _hqlTree.TreeBuilder.Alias(joinClause.ItemName))); + var expression = HqlGeneratorExpressionVisitor.Visit(joinClause.InnerSequence, VisitorParameters).AsExpression(); + var hqlJoin = _hqlTree.TreeBuilder.InnerJoin( + expression, + _hqlTree.TreeBuilder.Alias(querySourceName) + ); + hqlJoin.AddChild(_hqlTree.TreeBuilder.With(whereClause.ToBooleanExpression())); + _hqlTree.AddFromClause(hqlJoin); } public override void VisitGroupJoinClause(GroupJoinClause groupJoinClause, QueryModel queryModel, int index)