我有两个服务器:生产服务器SQL Server 2005和我的测试服务器(LocalDb)\ MSSQLLocalDB 2016
我在Linq请求中使用.Net Framework 4.5.2和EntityFramework 6:
query.Select(l => l.s.Field1 + l.s.Field2).ToList();
在生产服务器上工作,生成的sql为:
SELECT CASE WHEN ([Extent1].[Field1] IS NULL) THEN N''
ELSE [Extent1].[Field1] END +
CASE WHEN ([Extent1].[Field2] IS NULL) THEN N''
ELSE CAST( [Extent1].[Field2] AS nvarchar(max))
END AS [C1]
但是在本地服务器上我有这个错误:
无法转换类型' System.Nullable`1 [[System.Int32,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089]]'键入' System.Object'。 LINQ to Entities仅支持转换EDM原语或枚举类型。
我知道如何解决我的问题。
我把我的字段放在一个匿名对象ToList()中,然后我连接起来 ToList()
另一个解决方案是:
query.Select(l => l.s.Field1 + SqlFunctions.StringConvert((decimal?)l.s.Field2).Trim())
但我想理解为什么会有这种差异:
我已将兼容性放在本地服务器上,与2008年相同。
如果我这样做:
Field2.Value
错误:
无法转换类型&System; Int32'键入' System.Object'。 LINQ to Entities仅支持转换EDM原语或枚举类型。
Field2.Value.ToString()
错误:
LINQ to Entities无法识别方法' System.String ToString()'方法,并且此方法无法转换为商店表达式。**
这是(LocalDb)\ MSSQLLocalDB的限制吗?
2005年以后这种事情是不允许的?
可以选择激活/停用隐式转换
欢迎任何线索。
答案 0 :(得分:0)
这可能有所帮助:
query.Select(l => l.s.Field1 + (l.s.Field2 ?? "").ToString()).ToList();
答案 1 :(得分:0)
我找到了问题所在。这是EntityFramework的简单版本问题:在我的测试中,我在6.0.0和生产6.1.3中。
抱歉