Как вернуть объединенные объекты в результате выполнения критериев?

#nhibernate #criteria

#nhibernate #критерии

Вопрос:

Мне интересно, как я могу представить следующее в criterions API

 return DataContext.Session.CreateQuery("
    select
        ss.PracticeArea 
    from Subsection as ss
    where ss.Location = :Location
    ")
    .SetEntity("Location", location)
    .List<PracticeArea>();
  

Предложение where достаточно прямолинейно, но я не понимаю, как получить объединенный объект в результате?

 DataContext.Session.CreateCriteria<Subsection>()
    .Add(Restrictions.Eq("Location", location))
    .List<PracticeArea>();
  

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

Ответ №1:

Попробуйте это:

 DataContext.Session
    .CreateCriteria<Subsection>()
    .CreateCriteria("Subsecion", "ss")
    // the "select" clause is called "projection"
    .SetProjection(Projections.Property("ss.PracticeArea"))
    .Add(Restrictions.Eq("Location", location))
    .List<PracticeArea>();
  

Комментарии:

1. Похоже, в каком направлении мне следует двигаться. Однако, похоже, он получает области применения при последующих выборках, а не при одном попадании. Извините, я не думаю, что было ясно, что Location и PracticeArea являются сущностями. Одна вещь, которая меня смущает, — это второй createCriteria? Заранее спасибо.

2. Второй критерий создания — это просто объединение. Вы могли бы попробовать без этого. Если выполняется слишком много выборок, попробуйте .SetFetchMode(ss.PracticeArea, FetchMode.Join)

Ответ №2:

У меня есть следующее для работы, я не знаю, будет ли это работать лучше или хуже, чем использование проекции?

 DetachedCriteria subsections = DetachedCriteria.For<Subsection>()
    .SetProjection(Projections.Property("PracticeArea.Id"))
    .Add(Restrictions.Eq("Location", location));

return DataContext.Session
    .CreateCriteria<PracticeArea>()
    .Add(Subqueries.PropertyIn("Id",subsections))
    .List<PracticeArea>();