2011-11-24 43 views

cevap

5

NHibernate System.Collections.SortedList ve Iesi.Collections.SortedSet uyguladığı koleksiyonları destekler. Sen haritalama dosyasında bir karşılaştırıcısı belirtmek gerekir: sort özelliğinin

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

İzin verilen değerler tasnifsiz doğal ve System.Collections.IComparer uygulayan bir sınıf adı verilebilir.

Eğer veritabanı kendisi toplama elemanları seti, çanta veya harita dönüşümlerin özelliğiyle sırasını kullanmak sipariş etmek istiyorum. Bu, SQL sorgusunda, bellekte değil, sıralamayı gerçekleştirir.

özelliğe göre sırasını-Ayar elemanlarının sırasını koruyarak sözlükler ve setleri için dahili olarak ListDictionary veya ListSet sınıfını kullanmak için NHibernate söyler. Bu koleksiyonlardaki arama işlemlerinin, birkaç öğeden daha fazlasını içermesi durumunda çok yavaş olduğunu unutmayın.

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

Sipariş-özniteliğinin değerinin bir SQL siparişi olduğunu, bir HQL siparişinin olmadığını unutmayın!

Birlikler da bir filtre kullanılarak zamanında bazı keyfi ölçütlere göre sıralanmış olarak().

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

Kaynak: NHibernate and Sorted Collections