2011-11-24 11 views
5

私はcontainerという2つのクラスを持っています。これらは、動的順序リストElementを含んでいます。nhibernateで順序付きリストをマップする方法は?

どのようなC#コレクションを使用しますか?

あなたは私にどのようなDBスキーマを提案しますか?

nhibernateマッピングをどのように設定する必要がありますか?

TIA

答えて

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> 

できる値は、ソートされていない自然とSystem.Collections.IComparerを実装するクラスの名前です。

データベース自体でコレクション要素を並べ替えるには、set、bagまたはmapのマッピングのorder-by属性を使用します。これは、メモリーではなくSQL照会での順序付けを実行します。

order-by属性を設定すると、要素の順序を維持しながら、辞書やセットに対してListDictionaryまたはListSetクラスを内部的に使用するようにNHibernateに指示します。これらのコレクションのルックアップ操作は、数個以上の要素が含まれていると非常に遅いことに注意してください。

<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

関連する問題