Критерии nHibernate для выбора родителя, если у ребенка в коллекции есть определенное значение - PullRequest
5 голосов
/ 28 апреля 2010

Если у меня следующая структура класса, каковы критерии 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 ]

16 голосов
/ 28 апреля 2010

Я бы просто создал псевдоним для коллекции и добавил ограничения.

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 = ?

Отдельный корневой преобразователь сущностей будет обрабатывать набор результатов и удалять дублированных родителей. Они все еще сталкиваются с проводом, хотя.

0 голосов
/ 28 апреля 2010

Я создал запрос критерия для родительского типа, использовал 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...