NHibernate obsługuje zbiory realizowanych przez System.Collections.SortedList i Iesi.Collections.SortedSet. Musisz podać porównywarka w pliku odwzorowania:
<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>
dozwolone wartości atrybutu sortowania są nieposortowane, naturalne i nazwa klasy wykonawczego System.Collections.IComparer.
Jeśli chcesz, aby sama baza danych zamawiała elementy kolekcji, użyj atrybutu kolejności według ustawień mapowania, torby lub map. Wykonuje to porządkowanie w zapytaniu SQL, a nie w pamięci.
Ustawienie atrybutu order-by mówi NHibernate, aby wewnętrznie używać klasy ListDictionary lub ListSet dla słowników i zestawów, zachowując kolejność elementów. Zauważ, że operacje wyszukiwania w tych kolekcjach są bardzo powolne, jeśli zawierają więcej niż kilka elementów.
<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>
Należy zauważyć, że wartość atrybutu order-by jest zamówieniem SQL, a nie zamawianiem HQL!
Powiązania mogą być sortowane według dowolnych kryteriów w środowisku wykonawczym za pomocą filtru().
sortedUsers = s.Filter(group.Users, "order by this.Name");
Źródło: NHibernate and Sorted Collections