在Nhibernate中订购一个像数字一样的字符串

时间:2012-11-03 11:44:06

标签: mysql nhibernate fluent-nhibernate

我有一个字符串而不是int,只是因为可能会出现这样的情况:

1, 2, 3, 3A, 5, 6 ...

现在,orderby在某种程度上运行良好,但并不像预期的那样:

1
10
11
111
12
2
20
3

有人知道这样做吗?我的数据库是MySQL。我在其他问题上注意到了这个解决方案..

ORDER BY category_id + 0

如何在Fluent Nhibernate中实现它?

修改

要澄清,所需的顺序应为:

1
2
3
3A
10
11
12
20
111
...

编辑2

另请注意,它可能不仅仅是3A,它还可能有更多输入,例如:3B,3C。

订单将是:

1
2
3
3A
3B
3C
10
11
...

2 个答案:

答案 0 :(得分:2)

您可以将此列映射两次。完全适用于所有操作。一次仅用于“选择”和订购。 在 XML 映射中,它将如下所示:(列名为[ AsNumber ])

<property name="AsString" column="AsNumber"  />
<property name="AsNumber"  insert="false" update="false" 
 formula="(CAST ( CASE WHEN ISNUMERIC([AsNumber]) &lt;&gt; 0 THEN [AsNumber] ELSE '99999999' END  as int))"
/>

我使用的语法来自MS SQL Server。它试图解决上面的“ 3A ”之类的情况。它将简单地转换为一些大的价值......

请注意,'AsNumber'的insert和update设置为false。 和C#类片段:

public virtual string AsString { get; set; }
public virtual int AsNumber { get; set; }

我已经测试了它并且它正在运行。我确信使用类似的流利不会花费你很长时间......

答案 1 :(得分:0)

您可以创建类似

的公式字段
Map(x => x.MyColumnAsNumber).Formula("CAST(MyColumn AS int)");

然后按该字段排序。