NHibernate поддерживает коллекции, реализованные в System.Collections.SortedList и Iesi.Collections.SortedSet.Вы должны указать компаратор в файле сопоставления:
<set name="Aliases" table="person_aliases" sort="natural">
<key column="person"/>
<element column="name" type="String"/>
</set>
<map name="Holidays" sort="My.Custom.HolidayComparer, MyAssembly" lazy="true">
<key column="year_id"/>
<index column="hol_name" type="String"/>
<element column="hol_date" type="Date"/>
</map>
Допустимые значения атрибута sort являются несортированными, естественными и имя класса, реализующего System.Collections.IComparer.
Если выЧтобы сама база данных упорядочивала элементы коллекции, используйте атрибут order-by отображений set, bag или map.Это выполняет упорядочение в SQL-запросе, а не в памяти.
Установка атрибута order-by указывает NHibernate использовать внутренний класс ListDictionary или ListSet для словарей и наборов, поддерживая порядок элементов.Обратите внимание, что операции поиска в этих коллекциях очень медленные, если они содержат более нескольких элементов.
<set name="Aliases" table="person_aliases" order-by="name asc">
<key column="person"/>
<element column="name" type="String"/>
</set>
<map name="Holidays" order-by="hol_date, hol_name" lazy="true">
<key column="year_id"/>
<index column="hol_name" type="String"/>
<element column="hol_date type="Date"/>
</map>
Обратите внимание, что значением атрибута order-by является порядок SQL, а не порядок HQL!
Ассоциации могут даже сортироваться по некоторым произвольным критериям во время выполнения с использованием Filter ().
sortedUsers = s.Filter( group.Users, "order by this.Name" );
Источник: NHibernate и Sorted Collections