c# - LINQ 中字母数字数据的 SQL Order By 子句未按预期排序

标签 c# sql-server linq sorting alphanumeric

我有一个 SQL Server Reporting Services (SSRS) 报告,该报告使用 SQL order by 排序并返回以下字母数字字符串数据:

Value: 0.0
Value: 20.96
Value: 289.64
Value: 30.99
Value: 308.655
Value: -32296.32
Value: 34.844
Value: 38.95
Value: -697.38
Value: -703.48

每个字符串的格式如下:

`Value: numeric data`

SQL order by 似乎按字符串排序,但忽略了数值前的减号。

我正在使用 C# 和 LINQ 对字符串进行排序以尝试匹配该排序:

var _sorted = _unsortedValues.OrderBy(x => x.Description);

我得到:

Value: -32296.32
Value: -697.38
Value: -703.48
Value: 0.0
Value: 20.96
Value: 289.64
Value: 30.99
Value: 308.655
Value: 34.844
Value: 38.95

默认情况下,LINQ 对字符串进行排序,所有负值首先升序排列,然后是零值,然后是正值

关于如何获得所需的排序以复制 SSRS 排序的任何想法?

注意

我在这个报告列中有其他类型的字符串被正确排序。 例如

"Timestamp: data time data"
"Identifier: string data"

最佳答案

我想这里的 LINQ 是指常规 LINQ to objects,而不是 Entity Framework 或 LINQ to sql。字符串的排序方式取决于使用的比较器,您可以将您喜欢的任何比较器传递给 OrderBy 语句。因此,例如要获得所需的排序,您可以这样做:

var sorted = _unsortedValues.OrderBy(x => x.Description, StringComparer.InvariantCulture).ToArray();

这将返回与您的 SQL 语句相同的顺序。

同时如果你将使用另一个比较器,像这样:

var sorted = _unsortedValues.OrderBy(x => x.Description, StringComparer.Ordinal).ToArray();

您将得到问题中的顺序(负数在前)。

为什么你得到了你得到的订单,但其他人却无法重现?这是因为默认情况下,使用 CurrentCulture 字符串比较器,不同机器的当前文化可能不同,因此人们会得到不同的结果。

var sorted = _unsortedValues.OrderBy(x => x.Description, StringComparer.CurrentCulture).ToArray(); // this is what is done by default

关于c# - LINQ 中字母数字数据的 SQL Order By 子句未按预期排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39764796/

相关文章:

c# - 在 MVVM 中处理复制和粘贴(剪贴板)

c# - MVC 网站发布后看起来不一样

c# - 作为系统运行的Windows服务无法访问C :\users\

c# - 对具有字符串/空值的列使用 dt.AsEnumerable().Sum

asp.net-mvc - 如何仅在C#中按时间和时间排序?

c# - 有没有办法从 iTextSharp 读取 TrimBox 和 BleedBox 尺寸?

SQL Server 数据库更改工作流最佳实践

sql-server - SQL Server : Normal Index vs. 全文索引

sql - 从 URL(Azure 存储)还原数据库失败,没有更多详细信息

linq - Entity Framework 创建最新的 IQueryable