使用LINQ和Entity Framework添加前导零

时间:2015-11-30 08:28:55

标签: entity-framework linq linq-to-entities

我尝试通过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.

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:15)

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

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

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

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

(长度计算需要修改,我希望你能得到这个想法)

答案 1 :(得分:3)

从错误中您使用LINQ to Entities(使用实体框架)。

因此,LINQ表达式被转换为SQL以便在您的数据库上执行。并且没有ToString(string format)直接转换为SQL。

您有两种选择:

  1. 使用SqlFunctions:LINQ to Entities知道如何将这些转换为SQL。

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

  3. 但是,您似乎用零填充数值,然后对其进行排序。为什么不在服务器上进行数字排序,然后在客户端上进行格式化:使用前导零进行填充以允许数字字符串排序,就像它们是数字一样,但是您已经有数字。

答案 2 :(得分:0)

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

附注。使用值 1000000000 因为 Int32.MaxValue = 2147483647