Entity Framework ToString 方法

5

以下代码块抛出错误。

LINQ to Entities不认识'System.String ToString()'方法,并且这个方法无法被转换为存储表达式。

db.tbOnIgmHawbDetails
  .Where(s => !db.tbImpoExaminations.Any(x => x.Hawb.ToString() == s.Hawb) && s.AwbNo == p)
  .Select(s => s.Hawb).ToList();

有什么建议吗?为什么会发生这种情况,有什么解决方案?

x.hawb是长整型的一种,而x.hawb也是字符串类型的,因此... - Sagar Upadhyay
我认为你应该覆盖 ToString 函数,例如,为对象类型 x 定义名为 'HawbToString' 的新函数。好吗? - Maziar Aboualizadehbehbahani
你已经标记了 Linq-To-Sql,但是却收到了一个 Linq-To-Entities 异常? - Tim Schmelter
@DanDrews,建议的重复问题中没有好的解决方案。它们都建议将其转换为LINQ-To-Objects。但在这里不可能。 - xanatos
显示剩余3条评论
5个回答

15

好消息 :-) 感谢您在这里提到这些信息。 - Stephan Bauer
这个方法可行,而且它有助于提高使用.AsEnumerable()的操作性能。 - James Reategui

10
您可以尝试使用SqlFunctions.StringConvert... 使用decimal转换:
SqlFunctions.StringConvert((decimal)p.x.Hawb).TrimLeft() == ...

TrimLeft是必需的,因为SQL的STR函数会将数字右对齐)


4
ToString() 方法在 EF 6.1 中被支持:http://blogs.msdn.com/b/adonet/archive/2014/03/17/ef6-1-0-rtm-available.aspx - Scott Stafford

1

在 L2E 不支持的方法前面轻松添加 .AsEnumerable(),例如 .ToString() 等:

var asen = db.tbOnIgmHawbDetails.AsEnumerable();

var result =  asen.Where(s => !asen.Any(x => x.Hawb.ToString() == s.Hawb) && s.AwbNo == p)
  .Select(s => s.Hawb).ToList();

那应该可以工作。但是如果不行,请尝试使用linq-to-objects语法执行查询:

var result = from a in asen
             where ...
             select ...;

2
AsEnumerable() 不会导致下一次调用运行查询吗?这将拉取整个表格,这与使用数据库的初衷相违背... - Steven Hunt
1
当然可以!L2E只是将你的L2E命令转换为原始SQL,因此它不识别“.ToString()”或任何其他函数...你应该从数据库中提取所需记录,并对内存列表执行这些函数...这只是实现该目标的几种方法之一... - Amin Saqi

1
如果s.Hawb已经是字符串类型(错误信息提示如此),则从查询中删除.ToString()部分。
原因是在LINQ2SQL中,您只能使用可以转换为SQL的语言结构。例如,如果您尝试在C#表达式中使用RegEx,则SQL没有相应的构造函数来实现RegEx,因此LINQ无法翻译和执行您的查询。

2
-1- 当s是lambda查询的一部分时,如何在LINQ查询之外调用s.Hawb.ToString() - Jakub Konecki

0

不要使用 ToString

只需像这样使用

x.Hawb + "" == s.Hawb


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接