Skip to content

Inner Join fails with left Outer Join when referenced in Where clause #3104

Closed
@0zancan

Description

@0zancan

Code Block

           var item = (from customer in ISession.Query<Customer>()
                                     join customerComm in ISession.Query<CustomerCommunication>()
                                     on new { customer.CustomerNo, IsDefault = true, CommunicationType = "MobilePhone" } equals new { customerComm.CustomerNo, customerComm.IsDefault, customerComm.CommunicationType }
                                     into leftCustomerComm
                                     from communication in leftCustomerComm.DefaultIfEmpty()
                                     join customerAddress in ISession.Query<CustomerAddress>()
                                     on new { customer.CustomerNo, IsDefault = true, AddressType = "Home" } equals new { customerAddress.CustomerNo, customerAddress.IsDefault, customerAddress.AddressType }
                                     into leftCustomerAddress
                                     from address in leftCustomerAddress.DefaultIfEmpty()
                                     join custReq in ISession.Query<CustomerRequest>()
                                     on customer.CustomerNo equals custReq.CustomerNo
                                     where custReq.IsReady
                                     select new
                                     {
                                         customer.Key,
                                         customer.CustomerNo,
                                         communication,
                                         address
                                     }).WithOptions(x => x.SetReadOnly(true))
                                .ToDictionary(x => x.Key, x => new 
                                {
                                    CustomerNo = x.CustomerNo,
                                    CustomerCommunication = x.communication,
                                    CustomerAddress = x.address
                                }); 

Exception

Unable to cast object of type 'Remotion.Linq.Clauses.JoinClause' to type 'Remotion.Linq.Clauses.FromClauseBase'.

Stack Trace

   at System.Runtime.CompilerServices.CastHelpers.ChkCast_Helper(Void* toTypeHnd, Object obj)
   at NHibernate.Linq.GroupJoin.GroupJoinAggregateDetectionVisitor.VisitQuerySourceReference(QuerySourceReferenceExpression expression)
   at Remotion.Linq.Clauses.Expressions.QuerySourceReferenceExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.VisitMember(MemberExpression node)
   at NHibernate.Linq.GroupJoin.GroupJoinAggregateDetectionVisitor.VisitMember(MemberExpression expression)
   at System.Linq.Expressions.ExpressionVisitor.VisitBinary(BinaryExpression node)
   at System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor)
   at System.Linq.Expressions.ExpressionVisitor.VisitBinary(BinaryExpression node)
   at System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor)
   at NHibernate.Linq.GroupJoin.GroupJoinAggregateDetectionQueryModelVisitor.VisitWhereClause(WhereClause whereClause, QueryModel queryModel, Int32 index)
   at Remotion.Linq.Clauses.WhereClause.Accept(IQueryModelVisitor visitor, QueryModel queryModel, Int32 index)
   at Remotion.Linq.QueryModelVisitorBase.VisitBodyClauses(ObservableCollection`1 bodyClauses, QueryModel queryModel)
   at Remotion.Linq.QueryModelVisitorBase.VisitQueryModel(QueryModel queryModel)
   at NHibernate.Linq.GroupJoin.AggregatingGroupJoinRewriter.ReWrite(QueryModel model)
   at NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root, Nullable`1 rootReturnType)
   at NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory, Boolean filter)
   at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
   at NHibernate.Engine.Query.QueryExpressionPlan.CreateTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
   at NHibernate.Engine.Query.QueryExpressionPlan..ctor(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
   at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
   at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
   at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
   at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query)
   at NHibernate.Linq.DefaultQueryProvider.ExecuteList[TResult](Expression expression)
   at NHibernate.Linq.NhQueryable`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer)
   at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector)

Expected SQL

select
*
from
	CUSTOMER cstcustome0_
left outer join CUSTOMER_COMMUNICATION cstcustome1_ on
	(cstcustome1_.customer_no = cstcustome0_.customer_no
		and cstcustome1_.communication_type =:p1)
left outer join CUSTOMER_ADDRESS cstcustome2_ on
	(cstcustome2_.customer_no = cstcustome0_.customer_no
		and cstcustome2_.is_default =:p2
		and cstcustome2_.address_type =:p3)
inner join CUSTOMER_REQUEST customerco3_ on
	(customerco3_.customer_no = cstcustome0_.customer_no)
where
	customerco3_.is_ready

	:p1 = 'MobilePhone' [type:String],
	:p2 = 1 [type:Int16],
	:p3 = 'Home' [type:String],

LINQ It works with version 5.4.0-dev.3745 but it doesn't work with 5.4.0-dev.3840 and later versions.
The issue is where custReq.IsReady block.
If I remove it or use where customerComm.IsReady query is executed successfully

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions