, если вы хотите фильтровать коллекцию по требованию, использование фильтра является правильным выбором.
Вам необходимо объявить фильтр как для класса Version, так и для элемента bag, и применить фильтр из метода NHibernateSession.EnableFilter
, если вы всегда хотите получить одну версию в сумке, тогда укажите «где» в отображении сумки:
<bag name="Versions" cascade="all-delete-orphan" inverse="true" lazy="false" where="CurrentVersionNumber = Versions.VersionNumber" >
<key column="DataObjectId" />
<one-to-many class="DataObjectVersion" />
</bag>
обратите внимание, что в «где» вы пишете правильный SQL, а не HQL, и, следовательно, правильный SQL, который я пишу выше, вероятно, должен быть изменен, чтобы отражать вашу схему
Кроме того, если для извлечения одного предмета необходимо установить сумку, и соответствующий IList может быть излишним.
Применение свойства формулы и объекта DataObjectVersion в классе может быть более подходящим
в классе DataObject замените IList на
public virtual DataObjectVersion Version { get; set; }
и в отображении замените 'сумку' на что-то вроде
<property name="Version" type="DataObjectVersion" update="false" insert="false" formula="(select v.DataObjectVersionId, v.Comments, v.VersionNumber, v.DataObjectId from DataObjectVersion v where v.VersionNumber = CurrentVersionNumber)" />
опять разрешен только правильный SQL
Я использовал вычисленные свойства с собственными типами данных (дата, время, строка и т. Д.), И для извлечения сущности может (или не может) потребоваться что-то большее или другое
И последнее, но не менее важное: вы можете применить фильтр к коллекции после того, как вы выбрали первичный объект DataObject, создав фильтр для коллекции
IList<DataObjectVersion> fVersion =
NHibernateSession.CreateFilter(do.Versions, "where VersionNumber = :ver")
.SetParameter("ver", do.CurrentVersionNumber)
.List<DataObjectVersion>();
там, где коллекция do.Versions не инициализирована, только результаты, извлеченные в отдельном собрании fVersion, и это второй SELECT после того, как уже выполнен возврат в базу данных для выборки DataObject.