我尝试通过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.
这样做的正确方法是什么?
答案 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。
您有两种选择:
使用SqlFunctions
:LINQ to Entities知道如何将这些转换为SQL。
在客户端上执行该部分处理(可能在LINQ to Objects中)。
但是,您似乎用零填充数值,然后对其进行排序。为什么不在服务器上进行数字排序,然后在客户端上进行格式化:使用前导零进行填充以允许数字字符串排序,就像它们是数字一样,但是您已经有数字。
答案 2 :(得分:0)
当您知道 Seq
数字不能很大时,这是一个简单的解决方法。
例如,如果 Seq
是 Int32 并且您知道 Seq
数小于 1000000000,那么您可以在 LINQ 查询中使用 .OrderBy(a => 1000000000 + a.Seq)
。
附注。使用值 1000000000 因为 Int32.MaxValue = 2147483647