nHibernate标准,用于在集合中的子项具有特定值时选择父项

时间:2010-04-28 13:01:36

标签: nhibernate criteria

如果我有以下类结构,如果父类中有一个具有特定名称,那么选择父类的NHibernate标准是什么?

 public class Child
 {
     public int Id { get; set; }
     public int Name { get; set; }
 }

 public class Parent
 {
     public int Id { get; set; }
     public IList<Child> Children { get; set; }
 }

2 个答案:

答案 0 :(得分:16)

我只是为集合创建一个别名并添加限制。

var parentsWithKidName = session.CreateCriteria<Parent>()
    .CreateAlias("Children", "c", JoinType.InnerJoin)
    .Add(Restrictions.Eq("c.Name", childName))
    .SetResultTransformer(Transformers.DistinctRootEntity()) 
    .List<Parent>();

这会导致

select p.* 
from parent p 
inner join child c on /* however it's mapped? */
where c.Name = ?

不同的根实体转换器将处理结果集并删除重复的父级。他们仍然遇到了电线。

答案 1 :(得分:0)

我所做的是为父类型创建条件查询,使用return为子类型创建条件查询,然后将特定条件添加到子类型子查询。

public virtual IList<T> GetByChildCriteria(string childName,
   params ICriterion[] criterion)
{
     ICriteria criteria = NHibernateSession
     .CreateCriteria(persitentType)
     .CreateCriteria(childName);
     foreach (ICriterion criterium in criterion)
     {
         criteria.Add(criterium);
     }
     return criteria.List<T>();
}

注意:NHibernateSession变量的类型为ISession。