2011-11-24 35 views

Trả lời

5

NHibernate hỗ trợ các bộ sưu tập được thực hiện bởi System.Collections.SortedList và Iesi.Collections.SortedSet. Bạn phải chỉ định bộ so sánh trong tệp ánh xạ:

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

Giá trị được phép của thuộc tính sắp xếp không được phân loại, tự nhiên và tên của lớp thực thi System.Collections.IComparer.

Nếu bạn muốn cơ sở dữ liệu tự đặt hàng các phần tử thu thập, hãy sử dụng thuộc tính theo thứ tự của các ánh xạ tập hợp, túi hoặc bản đồ. Điều này thực hiện thứ tự trong truy vấn SQL, không phải trong bộ nhớ.

Đặt thuộc tính theo thứ tự cho NHibernate sử dụng lớp ListDictionary hoặc ListSet bên trong cho từ điển và bộ, duy trì thứ tự của các phần tử. Lưu ý rằng các hoạt động tra cứu trên các bộ sưu tập này rất chậm nếu chúng chứa nhiều hơn một vài phần tử.

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

Lưu ý rằng giá trị của thuộc tính theo thứ tự là một thứ tự SQL, không phải thứ tự HQL!

Các liên kết thậm chí có thể được sắp xếp theo một số tiêu chí tùy ý khi chạy bằng Bộ lọc().

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

Nguồn: NHibernate and Sorted Collections

Các vấn đề liên quan