Linq to SQL - 如何对包含数字和十六进制值的varchar字段进行排序

时间:2011-01-23 16:54:29

标签: linq-to-sql hex

我有一个客户端提供的数据表,其中包含一组组代码。在第1组中,我有1,2,3,4,5,6,7,8,9,10,还有1A,2A等等。

数据类型当前是varchar(10),客户端希望排序顺序如下: 1 2 3 4 五 6 7 8 9 10 1A 2A ...

但它出来了: 1 10 1A 2 2A 3 4 五 6 7 8 9 ...

有什么方法可以让我以正确的顺序出来吗?

2 个答案:

答案 0 :(得分:1)

您确定此列中的数字(十六进制格式,但无关紧要)?如果是,则最好更改表结构和存储号本身(并将其格式化仅用于查看/编辑)。在这种情况下,可以在服务器端轻松执行排序(我的意思是DB服务器)。

答案 1 :(得分:0)

通常,您可以通过将字符串解析为数字并指定System.Globalization.NumberStyles.AllowHexSpecifier来实现此目的。

由于这是LINQ to SQL,因此不会有翻译。因此,您需要在完成查询的其余部分后应用排序,并立即通过AsEnumerableToList执行排序。请记住,通过这样做,查询请求的所有匹配数据都将被发送到客户端,因此重要的是先前过滤然后在客户端应用排序。

您的查询与此类似:

dc.Table
  .Select(o => o.Number) // where number is the property/column name
  .AsEnumerable()
  .OrderBy(s => Int32.Parse(s, System.Globalization.NumberStyles.AllowHexSpecifier))

以下是没有LINQ to SQL的实例:

string[] numbers = { "1", "10", "1A", "2", "2A", "3", "4", "5", "6", "7", "8", "9" };
var query = numbers.OrderBy(s => Int32.Parse(s, System.Globalization.NumberStyles.AllowHexSpecifier));
foreach (var s in query)
    Console.WriteLine(s);