4

我有一个字段是字符串而不是 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
...
4

2 回答 2

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”的插入和更新设置为 false。和 C# 类片段:

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

我已经对其进行了测试,并且可以正常工作。我相信在流利中使用类似不会花你很长时间......

于 2012-11-03T12:14:37.527 回答
0

您可以创建一个公式字段,例如

Map(x => x.MyColumnAsNumber).Formula("CAST(MyColumn AS int)");

然后按该字段排序。

于 2012-11-03T12:09:20.053 回答