2011-11-24 11 views

risposta

5

NHibernate supporta collezioni implementate da System.Collections.SortedList e Iesi.Collections.SortedSet. È necessario specificare un operatore di confronto nel file di mapping:

<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> 

valori ammessi dell'attributo tipo sono indifferenziati, naturale e il nome di una classe che implementa System.Collections.IComparer.

Se si desidera che il database stesso ordini gli elementi di raccolta, utilizzare l'attributo order-by di mappature set, bag o map. Questo esegue l'ordine nella query SQL, non in memoria.

L'impostazione dell'attributo order-by indica a NHibernate di utilizzare la classe ListDictionary o ListSet internamente per dizionari e insiemi, mantenendo l'ordine degli elementi. Nota che le operazioni di ricerca su queste raccolte sono molto lente se contengono più di pochi elementi.

<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> 

Si noti che il valore dell'attributo order-by è un ordinamento SQL, non un ordinamento HQL!

Le associazioni possono anche essere ordinate in base a criteri arbitrari in fase di runtime utilizzando un filtro().

sortedUsers = s.Filter(group.Users, "order by this.Name"); 

Fonte: NHibernate and Sorted Collections