2009-11-18 3 views
2

У меня есть объект Person. У каждого человека есть страна, я хочу выбрать все страны, в которых есть люди. Этот критерий запрос возвращает весь различный CountryId-хЗапрос на доступ к NHibernate - выберите Distinct with Registered Entity

criteria.SetProjection(Projections.Distinct(Projections.Property("Country"))); 

Как изменить его, чтобы присоединиться и принести объект страны, а не только ID?

ответ

2

Любой простой способ - использовать подзапрос. То есть вы можете выбрать всю страну по внешнему запросу, где идентификатор страны совпадает с внутренним запросом.

Subqueries.PropertyIn(
    "Country", 
    innerDetachedCriteriaWhichFindsCountriesWithPeopleAndProjectsCountryId) 
+0

Это будет работать, но у меня нет отдельных критериев, поэтому мне нужен способ преобразования ICriteria в DetachedCriteria, или я не могу использовать это. Этот конструктор выглядит многообещающим, но я понятия не имею, что передать в CriteriaImpl DetachedCriteria (NHibernate.Impl.CriteriaImpl, NHibernate.ICriteria) – reach4thelasers

+0

На самом деле вы можете пойти другим путем. Создайте свои критерии, используя только экземпляры DetachedCriteria (DetachedCriteria.For ()), а затем используйте GetExecutableCriteria (сеанс), чтобы преобразовать их в реальные, исполняемые критерии. –

+0

Это сработало, но мне пришлось потратить часы, меняя все объекты ICriteria на объекты DetachedCriteria, а затем прикрепите их к сеансу, когда они мне понадобятся. Любой другой способ привел бы к дублированию, и я был ужален раньше ошибками, где я обновлял одну вещь, а не другую. Дайте мне знать, если кто-нибудь знает, как это сделать с ICriteria, а не с DetachedCriteria – reach4thelasers