> "Query which *should* be issued to sql server:"
So you are saying the the exception occurs BEFORE the query is emitted? Or
is the SQL you show exactly what NHibernate produced?

I think it would be good if you also deploy the NHibernate.pdb file, so we
get line numbers in the stack trace.

Also, can you create a minimized test case with the bare minimum to
reproduce the problem?

/Oskar


2016-11-01 18:20 GMT+00:00 Taber Loveless <[email protected]>:

> Is this a bug or am I doing something wrong?
> QueryOver disjunction on Field mapped from Formula throws Object Null
> Exception but is field mapped normally it works
> Also, does not make a difference if I am Eager fetching or not and the
> actual query which would be issued to sql server does work
>
> *Message Mapping - *
> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
>   <class xmlns="urn:nhibernate-mapping-2.2" dynamic-update="true"
> name="DriverTech.NH.Entities.Message, DriverTech.NH, Version=1.0.4.19900,
> Culture=neutral, PublicKeyToken=null" table="DTECH_Msg">
>     <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0,
> Culture=neutral, PublicKeyToken=b77a5c561934e089">
>       <column name="msgID" />
>       <generator class="identity" />
>     </id>
>     <property name="MsgType" type="System.Int32, mscorlib,
> Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
>       <column name="msgType" />
>     </property>
>      SNIPPED
>     <many-to-one class="DriverTech.NH.Entities.TruckPCBase,
> DriverTech.NH, Version=1.0.4.19900, Culture=neutral, PublicKeyToken=null"
> name="TruckPCBase" not-found="ignore">
>       <column name="truckPCID" />
>     </many-to-one>
>     <many-to-one class="DriverTech.NH.Entities.DriverBase, DriverTech.NH,
> Version=1.0.4.19900, Culture=neutral, PublicKeyToken=null"
> name="DriverBase" not-found="ignore" formula=" CASE WHEN UserId = 0 THEN
> NULL ELSE UserId END " />
>     <many-to-one class="DriverTech.NH.Entities.ManagerBase,
> DriverTech.NH, Version=1.0.4.19900, Culture=neutral, PublicKeyToken=null"
> name="ReadByManager" not-found="ignore" formula=" CASE WHEN readManagerId
> &lt; 1 THEN NULL ELSE readManagerId END " />
>     <many-to-one class="DriverTech.NH.Entities.ManagerBase,
> DriverTech.NH, Version=1.0.4.19900, Culture=neutral, PublicKeyToken=null"
> name="FromManager" not-found="ignore">
>       <column name="fromManagerID" not-null="false" />
>     </many-to-one>
>     <many-to-one class="DriverTech.NH.Entities.ManagerBase,
> DriverTech.NH, Version=1.0.4.19900, Culture=neutral, PublicKeyToken=null"
> name="ToManager" not-found="ignore">
>       <column name="toManagerID" not-null="false" />
>     </many-to-one>
>   </class>
> </hibernate-mapping>
>
> *Code creating query over:*
>                 T typeAlias = null;
>
>                 var vehicleSubquery = NHibernate.Criterion.QueryOver.Of<
> ReportingGroupMembersDistinctByManager>()
>                     .Where(v => v.GroupType == ReportingGroupType.Vehicle)
>                     .And(v => v.ManagerId == filter.PortalUserId)
>                     .And(v => v.RecordId == typeAlias.TruckPCBase.Id)
>                     .Select(Projections.Constant(0));
>
>                 var driverSubquery = NHibernate.Criterion.QueryOver.Of<
> ReportingGroupMembersDistinctByManager>()
>                     .Where(v => v.GroupType == ReportingGroupType.User)
>                     .And(v => v.ManagerId == filter.PortalUserId)
>                     .And(v => v.RecordId == typeAlias.DriverBase.Id)
>                     .Select(Projections.Constant(0));
>
>                 query = Session.QueryOver<T>(() => typeAlias)
>                     .Where(Restrictions.Disjunction()
>                         .Add(Subqueries.WhereExists(vehicleSubquery))
>                         .Add(Subqueries.WhereExists(driverSubquery)))
>                     ;
>
>
> *Exception stack:*
>
>    at NHibernate.Persister.Entity.AbstractPropertyMapping.ToColumns(String
> alias, String propertyName)
>    at NHibernate.Persister.Entity.BasicEntityPropertyMapping.ToColumns(String
> alias, String propertyName)
>    at NHibernate.Persister.Entity.AbstractEntityPersister.ToColumns(String
> alias, String propertyName)
>    at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns(ICriteria
> subcriteria, String propertyName)
>    at NHibernate.Loader.Criteria.CriteriaQueryTranslator.
> GetColumnsUsingProjection(ICriteria subcriteria, String propertyName)
>    at NHibernate.Loader.Criteria.CriteriaQueryTranslator.
> GetColumnsUsingProjection(ICriteria subcriteria, String propertyName)
>    at 
> NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName(ICriteriaQuery
> criteriaQuery, ICriteria criteria, String propertyName)
>    at NHibernate.Criterion.CriterionUtil.GetColumnNames(String
> propertyName, IProjection projection, ICriteriaQuery criteriaQuery,
> ICriteria criteria, IDictionary`2 enabledFilters)
>    at NHibernate.Criterion.PropertyExpression.ToSqlString(ICriteria
> criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters)
>    at NHibernate.Loader.Criteria.CriteriaQueryTranslator.
> GetWhereCondition(IDictionary`2 enabledFilters)
>    at NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable
> persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor
> factory, ICriteria criteria, String rootEntityName, IDictionary`2
> enabledFilters)
>    at NHibernate.Criterion.SubqueryExpression.ToSqlString(ICriteria
> criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters)
>    at NHibernate.Criterion.Junction.ToSqlString(ICriteria criteria,
> ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters)
>    at NHibernate.Loader.Criteria.CriteriaQueryTranslator.
> GetWhereCondition(IDictionary`2 enabledFilters)
>    at NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable
> persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor
> factory, ICriteria criteria, String rootEntityName, IDictionary`2
> enabledFilters)
>    at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable
> persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria,
> String rootEntityName, IDictionary`2 enabledFilters)
>    at NHibernate.Impl.MultiCriteriaImpl.CreateCriteriaLoaders()
>    at NHibernate.Impl.MultiCriteriaImpl.List()
>    at NHibernate.Impl.FutureCriteriaBatch.GetResultsFrom(IMultiCriteria
> multiApproach)
>    at NHibernate.Impl.FutureBatch`2.GetResults()
>    at NHibernate.Impl.FutureBatch`2.get_Results()
>    at NHibernate.Impl.FutureBatch`2.GetCurrentResult[TResult](Int32
> currentIndex)
>    at NHibernate.Impl.FutureBatch`2.<>c__DisplayClass1`1.<
> GetFutureValue>b__0()
>    at NHibernate.Impl.FutureValue`1.get_Value()
>    at DriverTech.NH.Repositories.PagedResult`1.Paginate(IQueryOver`2
> queryOver, GridDataFilter filter) in C:\Projects\DriverTech\
> WebServices\FWAPI\DriverTech.NH\Repositories\PagedResult.cs:line 53
>    at DriverTech.NH.Repositories.LinqExtensions.Paginate[T](IQueryOver`2
> query, GridDataFilter filter) in C:\Projects\DriverTech\
> WebServices\FWAPI\DriverTech.NH\Repositories\LinqExtensions.cs:line 66
>    at DriverTech.NH.Repositories.Data.MessageRepository.<>c__
> DisplayClass1.<Get_Paged>b__0() in C:\Projects\DriverTech\
> WebServices\FWAPI\DriverTech.NH\Repositories\Data\MessageRepository.cs:line
> 96
>    at DriverTech.NH.Repositories.Repository`1.Transact[TResult](Func`1
> func, IsolationLevel isolationLevel) in C:\Projects\DriverTech\
> WebServices\FWAPI\DriverTech.NH\Repositories\RepositoryBase.cs:line 626
>    at 
> DriverTech.NH.Repositories.Data.MessageRepository.Get_Paged(GridDataFilter
> filter, Nullable`1 viewInboundOnly, Nullable`1 viewReadOnly) in
> C:\Projects\DriverTech\WebServices\FWAPI\DriverTech.NH\Repositories\Data\MessageRepository.cs:line
> 96
>    at DriverTech.Execution.MessageProcessor.Process(PagedRequestForJQGrid
> pagedRequest, Nullable`1 viewInboundOnly, Nullable`1 viewReadOnly, Int32&
> TotalRowCount) in C:\Projects\DriverTech\WebServices\FWAPI\DriverTech.
> Execution\MessageProcessor2.cs:line 97
>
>
> *Query which should be issued to sql server:*
> SELECT TOP (60 /* @p7 */) this_.msgID                      as msgID43_5_,
>                  this_.msgType                    as msgType43_5_,
>                  this_.iTime                      as iTime43_5_,
>                  this_.time                       as time43_5_,
>                  this_.bInbound                   as bInbound43_5_,
>                  this_.status                     as status43_5_,
>                  this_._to                        as column7_43_5_,
>                  this_._from                      as column8_43_5_,
>                  this_.subject                    as subject43_5_,
>                  this_.body                       as body43_5_,
>                  this_.rxTime                     as rxTime43_5_,
>                  this_.formID                     as formID43_5_,
>                  this_.stateID                    as stateID43_5_,
>                  this_.readTime                   as readTime43_5_,
>                  this_.priority                   as priority43_5_,
>                  this_.transport                  as transport43_5_,
>                  this_.bWantReceipt               as bWantRe17_43_5_,
>                  this_.receiptTime                as receipt18_43_5_,
>                  this_.iCustomerLink              as iCustom19_43_5_,
>                  this_.szCustomerLink             as szCusto20_43_5_,
>                  this_.bVolumeOverride            as bVolume21_43_5_,
>                  this_.replyID                    as replyID43_5_,
>                  this_.bImportant                 as bImportant43_5_,
>                  this_.DataXml                    as DataXml43_5_,
>                  this_.bHasAttachment             as bHasAtt25_43_5_,
>                  this_.fromManagerID              as fromMan26_43_5_,
>                  this_.toManagerID                as toManag27_43_5_,
>                  CASE
>                    WHEN this_.truckPCID < 1 THEN NULL
>                    ELSE this_.truckPCID
>                  END                              as formula3_5_,
>                  CASE
>                    WHEN this_.UserId = 0 THEN NULL
>                    ELSE this_.UserId
>                  END                              as formula4_5_,
>                  CASE
>                    WHEN this_.readManagerId < 1 THEN NULL
>                    ELSE this_.readManagerId
>                  END                              as formula5_5_,
>                  truckpcbas2_.truckPCID           as truckPCID71_0_,
>                  truckpcbas2_.truckName           as truckName71_0_,
>                  driverbase3_.userID              as userID25_1_,
>                  driverbase3_.employeeID          as employeeID25_1_,
>                  driverbase3_.logon               as logon25_1_,
>                  driverbase3_.driverName          as driverName25_1_,
>                  driverbase3_.bDeleted            as bDeleted25_1_,
>                  driverbase3_.timezone            as timezone25_1_,
>                  driverbase3_.buseDaylightSavings as buseDayl7_25_1_,
>                  managerbas4_.ManagerId           as ManagerId40_2_,
>                  managerbas4_.Login               as Login40_2_,
>                  managerbas4_.Name                as Name40_2_,
>                  managerbas5_.ManagerId           as ManagerId40_3_,
>                  managerbas5_.Login               as Login40_3_,
>                  managerbas5_.Name                as Name40_3_,
>                  managerbas6_.ManagerId           as ManagerId40_4_,
>                  managerbas6_.Login               as Login40_4_,
>                  managerbas6_.Name                as Name40_4_
> FROM   dbo.DTECH_Msg this_
>        left outer join dbo.vwVehicleSimple truckpcbas2_
>          on CASE
>               WHEN this_.truckPCID < 1 THEN NULL
>               ELSE this_.truckPCID
>             END = truckpcbas2_.truckPCID
>        left outer join dbo.vwDriverSimple driverbase3_
>          on CASE
>               WHEN this_.UserId = 0 THEN NULL
>               ELSE this_.UserId
>             END = driverbase3_.userID
>        left outer join dbo.DTECH_Managers managerbas4_
>          on CASE
>               WHEN this_.readManagerId < 1 THEN NULL
>               ELSE this_.readManagerId
>             END = managerbas4_.ManagerId
>        left outer join dbo.DTECH_Managers managerbas5_
>          on this_.fromManagerID = managerbas5_.ManagerId
>        left outer join dbo.DTECH_Managers managerbas6_
>          on this_.toManagerID = managerbas6_.ManagerId
> WHERE
> (exists (
>                /* criteria query */ SELECT 0 /* @p0 */ as y0_
>                 FROM   dbo.vwReportingGroupsMembers_GetDistinctByManagerId
> this_0_
>                 WHERE  this_0_.GroupType = 1 /* @p1 */
>                        and this_0_.ManagerId = 34 /* @p2 */
>                        and this_0_.RecordId = this_.truckPCID)
>          or exists (
>                    /* criteria query */ SELECT 0 /* @p3 */ as y0_
>                     FROM   dbo.vwReportingGroupsMembers_GetDistinctByManagerId
> this_0_
>                     WHERE  this_0_.GroupType = 0 /* @p4 */
>                            and this_0_.ManagerId = 34 /* @p5 */
>                            and this_0_.RecordId = this_.userID))
>  and(this_.msgType = 1 /* @p8 */
>          or this_.msgType = 10 /* @p9 */)
>        and this_.bInbound = 1 /* @p10 */
>        and (((this_.bInbound = 1 /* @p11 */
>               and this_.readTime is null)
>               or ((this_.bInbound = 0 /* @p12 */
>                    and this_.receiptTime is null)
>                   and this_.bWantReceipt = 1 /* @p13 */))
>              or (this_.bInbound = 0 /* @p14 */
>                  and this_.rxTime is null));
>
> --
> You received this message because you are subscribed to the Google Groups
> "nhusers" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at https://groups.google.com/group/nhusers.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.

Reply via email to