如果集合中的子项具有特定值,则选择父项的nHibernate标准

如果集合中的子项具有特定值,则选择父项的nHibernate标准,nhibernate,criteria,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 { ge

如果我有下面的类结构,那么如果父类的一个子类有一个特定的名称,那么选择父类的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; }
 }
公共类子类
{
公共int Id{get;set;}
公共int名称{get;set;}
}
公共类父类
{
公共int Id{get;set;}
公共IList子项{get;set;}
}

我所做的是为父类型创建一个条件查询,使用返回为子类型创建一个条件查询,然后将特定条件添加到子类型子查询中

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>();
}
公共虚拟IList GetByChildCriteria(字符串childName,
参数ICriterion[]标准)
{
ICriteria标准=NHibernateSession
.CreateCriteria(PersientType)
.CreateCriteria(childName);
foreach(标准中的ICriterion标准)
{
标准。添加(标准);
}
返回条件。List();
}

注意:NHibernateSession变量是ISession类型

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

var parentsWithKidName = session.CreateCriteria<Parent>()
    .CreateAlias("Children", "c", JoinType.InnerJoin)
    .Add(Restrictions.Eq("c.Name", childName))
    .SetResultTransformer(Transformers.DistinctRootEntity()) 
    .List<Parent>();
distinct root entity transformer将处理结果集并删除重复的父级。尽管如此,他们还是遇到了困难

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