Closed
Description
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