如果集合中的子项具有特定值,则选择父项的nHibernate标准
如果我有下面的类结构,那么如果父类的一个子类有一个特定的名称,那么选择父类的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
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 = ?