2011-11-24 21 views

回答

5

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一類的名稱。

如果您希望數據庫本身對集合元素進行排序,請使用set,bag或map映射的order-by屬性。這會在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 and Sorted Collections