#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>();