2011-11-24 12 views

Odpowiedz

5

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

Powiązane problemy