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