Profile is a one-to-many mapping snippet from the user.hbm.xml file:
Code:
<bag name="Profile" cascade="all" lazy="true" inverse="false">
<key column="UserId" />
<one-to-many class="ProfileItem" />
</bag>
ProfileItem mapping:
Code:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" schema="dbo">
<class name="WSDOT.Core.Domain.ProfileItem, WSDOT.Core" table="wsdot_Profile">
<id name="ID" type="Int32" column="ProfileId">
<generator class="identity" />
</id>
<many-to-one name="Application" column="ApplicationId" class="WSDOT.Core.Domain.Application, WSDOT.Core" />
<property name="UserId" column="UserId" type="Guid" />
<property name="LastUpdateDate" column="LastUpdateDate" type="DateTime" />
<property name="PropertyName" column="PropertyName" type="String" />
<property name="PropertyValueBinary" column="PropertyValueBinary" type="Byte[]" />
<property name="PropertyValueString" column="PropertyValueString" type="String" />
</class>
</hibernate-mapping>
Current Criteria query:
Code:
ICriteria criteria = Session.CreateCriteria(typeof(User), "u")
.CreateAlias("Membership", "m");
DetachedCriteria sub = DetachedCriteria.For<ProfileItem>("p");
sub.Add(Expression.Conjunction()
.Add(Expression.Like("p.PropertyName", "FirstName"))
.Add(Expression.Like("p.PropertyValueString", keyword, MatchMode.Anywhere)));
criteria.Add(Expression.Disjunction()
.Add(Expression.Like("u.UserName", keyword, MatchMode.Anywhere))
.Add(Expression.Like("m.Email", keyword, MatchMode.Anywhere))
.Add(Subqueries.Exists(sub))
);
//criteria.SetResultTransformer(CriteriaUtil.DistinctRootEntity);
var x = criteria.List(); //For debugging
IList<User> users = criteria.List<User>() as List<User>;
return users;
The above code does not actually work. I get a Object reference not set to an instance of an object error when it does criteria.List(). This appears to be on the sub-query since if I remove that it all works.
Error follows:
Quote:
Object reference not set to an instance of an object.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Source Error:
Line 67: //criteria.SetResultTransformer(CriteriaUtil.DistinctRootEntity);
Line 68:
Line 69: var x = criteria.List();
Line 70: IList<User> users = criteria.List<User>() as List<User>;
Line 71:
Source File: D:\Workspaces\CommuteLog_Main\WSDOT.Data\UserDao.cs Line: 69
Stack Trace:
[NullReferenceException: Object reference not set to an instance of an object.]
NHibernate.Loader.Criteria.CriteriaQueryTranslator.get_ProjectedTypes() +43
NHibernate.Criterion.SubqueryExpression.InitializeInnerQueryAndParameters(ICriteriaQuery criteriaQuery) +168
NHibernate.Criterion.SubqueryExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) +71
NHibernate.Criterion.Junction.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary`2 enabledFilters) +361
NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition(IDictionary`2 enabledFilters) +285
NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, CriteriaImpl criteria, String rootEntityName, IDictionary`2 enabledFilters) +399
NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary`2 enabledFilters) +159
NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) +295
NHibernate.Impl.CriteriaImpl.List(IList results) +65
NHibernate.Impl.CriteriaImpl.List() +55
WSDOT.CommuteLog.Data.UserDao.Find(String keyword) in D:\Workspaces\CommuteLog_Main\WSDOT.Data\UserDao.cs:69
WSDOT.Controllers.AccountController.List(Int32 page) in D:\Workspaces\CommuteLog_Main\WSDOT.Controllers\AccountController.cs:52
Thoughts?
Jack