我有两个类:container
,其中包含Element
的动态有序列表。
我应该使用哪种C#集合?
您建议我使用哪种数据库架构?
我应该如何配置nhibernate映射?
TIA
答案 0 :(得分: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属性的允许值是unsorted,natural和实现System.Collections.IComparer的类的名称。
如果您希望数据库本身对集合元素进行排序,请使用set,bag或map mappings的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" );