2010-08-05 96 views
1

我有一个hibernate查询返回一个对象列表,我想按标题排序。这是一个用户维护的字段,我们的一些客户喜欢在数字前加上标题,这不是我能控制的。数据是这样的:自然排序NHibernate

- 1 first thing 
- 2 second thing 
- 5 fifth thing 
- 10 tenth thing 
- 20 twentieth thing 
- A thing with no number 

传统

.AddOrder(Order.Asc("Name")) 

是导致文本排序:

- 1 first thing 
- 10 tenth thing 
- 2 second thing 
- 20 twentieth thing 
- 5 fifth thing 
- A thing with no number 

这是正确的,因为这是一个nvarchar的领域,但没有任何我可以通过这种方式获得数字吗?

似乎有几个解决方法涉及前缀所有领域与前导0和类似但通过NHibernate做任何这些工作?

此应用程序在Oracle和MsSQL上可交换使用。

干杯,

马特

回答

0

您可能会考虑创建一个custom sort order实现,该实现允许您指定列上的排序规则以实现所需的结果。沿着线的东西:

ORDER BY Name COLLATE Latin1_General_BIN ASC 

但有一个适当的归类(我不相信Latin1_General_BIN是你特别需要的东西)

+0

我做了类似的事情,但在C#中,唯一的情况是这是一个问题,当我有一个我希望向用户展示的项目的详尽列表,所以我检索对象(使用投影来获取id&名称),然后应用LINQ排序与自定义比较器来整理数字。 – 2010-08-10 15:33:44

+0

只是试图给你投票,因为这个答案看起来是正确的,但我没有足够的代表。相反,我将其标记为答案。 – 2010-08-10 15:34:39

0

添加附加字段(例如命名Name_Number)到对象上的服务器侧defenition和查询。

对于Oracle在此字段中选择to_number(Name) as Name_Number

对于MS SQL,请在此字段中选择cast(Name as numeric) as Name_Number

然后在客户端排序为.AddOrder(Order.Asc("Name_Number"))

附:我不确定,因为没有足够的经验来使用hibernate/nhibernate和讨厌ORM)

+0

不幸的是,这将无法正常工作的数量是场实际上没有一个单独的数据部分,它的一些额外的文本,一些用户添加优先项目,使其出现在订购的早些时候。 – 2010-08-10 15:30:51