Если у меня есть следующая структура класса, что критерии 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; }
}
Я бы просто создал псевдоним коллекции и добавил ограничения.
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 = ?
Преобразователь отдельного корневого объекта обработает набор результатов и удалит повторяющиеся родительские объекты. Тем не менее, они все еще сталкиваются с проволокой.
Я создал запрос критерия для родительского типа, использовал возвращаемый элемент для создания запроса критериев для дочернего типа, а затем добавил конкретные условия в подзапрос дочернего типа.
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.