1

在 linq-to-entities 查询中,在查询 nvarchar 列时,如何将空格添加到较短长度的值?

我寻求这种能力来促进对某些字段的正确排序。

这是我的场景

我的数据库几乎在每个表中都包含零件编号列。这些零件号列在数据库中表示为 nvarchar(20)。它们通常包含 6 位和 8 位部件号的组合。这些部分“数字”中的绝大多数实际上是数字;但有些是非数字的。因此,它们被表示为字符串而不是整数。

因为这些部件号表示为字符串而不是数字,所以它们不能正确排序。6 位和 8 位值混合在一起,而不是单独分组。所以我想用前导空格填充较短的长度值来解决排序问题。

我确实意识到,如果这些列被存储为nchar而不是nvarchar,我会自动得到这个填充。但是此时更改这些列的数据类型不是一种选择。

当我制作自己的 linq 查询时,我可以正确排序:

db.table.Select(_ => _.partNumberColumn).OrderBy(_ => _.Length).ThenBy(_ => _);

当其他工具(例如网格)自动组成查询时,就会出现问题。然后不知道额外的排序要求。因此,似乎一个好的解决方案是将空格添加到长度较短的值之前。

这是一个示例查询。当我构建模型时,我想在 6 个字符的值前面加上 2 个空格,而不仅仅是引入值。

_db.HubAssembliesWides
    .Select(_ =>
        new Models.HubAssemblyModel()
        {
            HubAssemblyNumber = _.HubAssemblyNumber,
            DetailedOnNumber = _.DetailedOnNumber,
            HubMachiningNumber = _.HubMachiningNumber,
            HubCastingNumber = _.HubCastingNumber,
            ComponentHubAssemblyNumber = _.ComponentHubAssemblyNumber
        }
    );

所以而不是

HubAssemblyNumber = _.HubAssemblyNumber

我想

HubAssemblyNumber = _.HubAssemblyNumber.Length == 6 ? "  " + _.HubAssemblyNumber : _.HubAssemblyNumber

这可以做到吗?谢谢!

4

1 回答 1

2

惊喜!我没有意识到我提出的语法确实有效。

HubAssemblyNumber = _.HubAssemblyNumber.Length == 6 ? "  " + _.HubAssemblyNumber : _.HubAssemblyNumber

当被 linq-to-entities 翻译成 T-SQL 时,被翻译成case语句。

于 2013-04-06T18:08:41.217 回答