I have a parent entity with a list of child entities. When using NHibernate to retrieve a given parent with children from SQL, it works fine if there are no children OR if
This took alot of research - the key to finding an answer is the term filter. I came across the term by digging through the NHibernate source code starting with AddJoin in ANSIJoinFragment.cs - the code supported additional conditions on the join so I figured it was possible.
Anyway, here's the revised code that utilizes filter (entity class remains the same).
Repository:
IList<Parent> foundParents = new List<Parent>();
var criteria1 = DetachedCriteria.For<Parent>()
.Add(Restrictions.Eq("ParentId", parentId))
.CreateCriteria("Children", JoinType.LeftOuterJoin);
Session.EnableFilter("dateFilter")
.SetParameter("startDate", startDate)
.SetParameter("endDate", endDate);
foundParents = Session
.CreateMultiCriteria()
.Add<Parent>(criteria1)
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.List()[0] as List<Parent>;
I also had to modify my mapping for Parent by adding filter and filter-def elements.
<class name="Parent" table="Parents">
...
<bag name="Children" table="Children">
...
<filter name="dateFilter"
condition="ChildDate BETWEEN :startDate and :endDate" />
</bag>
</class>
<filter-def name="dateFilter">
<filter-param name="startDate" type="System.DateTime" />
<filter-param name="endDate" type="System.DateTime" />
</filter-def>
Also, one word of warning for anyone that runs into this problem and doesn't use filters. If you decide to return the Parent entity without the populated children when the original query with the where clause yields no records, any code that hits the set of children will cause NHibernate to load the entire table.