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 there are children with dates that match the where condition.
If there are children that do not match the where clause, the parent is null. I want to have the parent initialized with an empty list of children.
Any thoughts on how I can modify the code below to make this happen?
Entities:
public class Parent
{
public int ParentId;
public IList<Child> Children { get; set; }
public Parent()
{
Children = new List<Child>();
}
}
public class Child
{
public int ChildId;
public DateTime ChildDate;
public Parent Parent { get; set; }
}
Repository:
IList<Parent> foundParents = new List<Parent>();
var criteria1 = DetachedCriteria.For<Parent>()
.Add(Restrictions.Eq("ParentId", parentId))
.CreateCriteria("Children", JoinType.LeftOuterJoin)
.Add(Restrictions.Or(
Restrictions.IsNull("ChildDate"), // no children at all
Restrictions.And(
Restrictions.Ge("ChildDate", startDate),
Restrictions.Le("ChildDate", endDate)
)
));
foundParents = Session
.CreateMultiCriteria()
.Add<Parent>(criteria1)
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.List()[0] as List<Parent>;
If I were writing SQL for this, I would put the date comparison in with the left join and not in the where clause. I can't figure out how to do this with NHibernate.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…