使用 LINQ 和 Entity Framework 添加前导零

Add leading zeros with LINQ and Entity Framework

我尝试通过 Linq 在我的 ASP MVC 应用程序中添加前导零:

int length = 4;
IEnumerable<object> query = [...]
select new
    {
        Seq = a.Seq.ToString("D" + length),
    }).OrderBy(a =>a.Seq).ToList();

.. 但我收到以下错误:

Additional information: LINQ to Entities does not recognize the method 'System.String ToString(System.String)' method, and this method cannot be translated into a store expression.

执行此操作的正确方法是什么?

我认为 String.PadLeft 是受支持的(至少在 Linq-To-Sql 中是有效的):

Seq = a.Seq.PadLeft(length, '0')}

如果这不起作用(我无法测试),您可以使用 SqlFunctions.Replicate:

Seq = SqlFunctions.Replicate("0", length - a.Seq.ToString().Length) + a.Seq

(长度计算需要修改,希望你能理解)

来自您使用 LINQ to Entities (with Entity Framework) 的错误。

因此,LINQ 表达式被翻译成 SQL 以便在您的数据库上执行。而且没有直接把ToString(string format)翻译成SQL.

你有两个选择:

  1. 利用 SqlFunctions:LINQ to Entities 知道如何将它们转换为 SQL。

  2. 在客户端执行该部分处理(可能在 LINQ to Objects 中)。

但是,您似乎在用零填充数值,然后对其进行排序。为什么不在服务器上按数字排序,然后在客户端进行格式化:用前导零填充是为了让数字字符串像数字一样排序,但你已经有了数字。

当您知道 Seq 数字不能很大时,这只是一个简单的解决方法。 例如,如果 Seq 是 Int32 并且您知道 Seq 数字小于 1000000000,那么您可以在 LINQ 查询中使用 .OrderBy(a => 1000000000 + a.Seq)

PS。由于 Int32.MaxValue = 2147483647

使用值 1000000000