终于解决了NHibernate的排序问题

来源:互联网 发布:北京华悦网络 编辑:程序博客网 时间:2024/06/09 13:38

首先说另一个问题,就是前面那篇文章上说的在Groups表中只调入ParentID为空的那些顶级组对象的方法:
???ICriterion ex=Expression.IsNull("ParentGroup");
???Order o=Order.Asc("GroupID");
???IList li=session.CreateCriteria(typeof(Group)).Add(ex).AddOrder(o).List();

第一句话定义一个条件,括号里面的是Group类里面该条件所对应的字段,而不是数据库里的真正字段名,第二句话定义一个排序,(这个只是提取这个顶级组的时候的排序),第三句话使用session的这个方法加载对象,它的后面可以跟多个条件。这样加载进来的List就是包含了所有顶级组的对象的列表,而且是排序的。但是这样并不能保证每个对象里的ChildGroups和Items里面所包含的子类也是排序的。

解决办法是,在类定义中直接使用IList类来定义这两个序列对象,而不是使用Iesi库里面的ISet。同时,在hbm配置文件里也不能使用set来定义one-to-many,要使用bag,这就是我一开始使用IList总是失败提示无法正确转换对象的原因所在。bag段允许一个特别定义:Order By。
????? <bag name="ChildGroups" inverse="true" table="Groups" cascade="all" order-by="GroupID asc">

通过这样的设置,在调入某个组所对应的下级组的时候,生成的SQL语句就会加上Order byGroupID,调入的对象也就是排序的了。(我还不知道bag后面加的这个是类里面字段的名字还是数据库里面字段的名字,应该是类里的名字,这个很容易试出来。因为我定义的两个字段的名字是相同的,所以暂时懒的去管它了)。

解决了这个问题,终于可以开始用NHibernate开发实用的程序了。

原创粉丝点击