SqlServer 2005 Ok,MSLocalDb 2016错误:LINQ to Entities仅支持转换EDM原语或枚举类型

时间:2017-06-15 09:19:09

标签: c# sql-server entity-framework linq

我有两个服务器:生产服务器SQL Server 2005和我的测试服务器(LocalDb)\ MSSQLLocalDB 2016

我在Linq请求中使用.Net Framework 4.5.2和EntityFramework 6:

query.Select(l => l.s.Field1 + l.s.Field2).ToList();
  • Field1:string
  • Field2:Nullable< int>

在生产服务器上工作,生成的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原语或枚举类型。

我知道如何解决我的问题。

  1. 我把我的字段放在一个匿名对象ToList()中,然后我连接起来 ToList()

  2. 之后的字段
  3. 另一个解决方案是:

    query.Select(l => l.s.Field1 + SqlFunctions.StringConvert((decimal?)l.s.Field2).Trim())      
    
  4. 但我想理解为什么会有这种差异:

    我已将兼容性放在本地服务器上,与2008年相同。

    如果我这样做:

    • Field2.Value错误:

        

      无法转换类型&System; Int32'键入' System.Object'。 LINQ to Entities仅支持转换EDM原语或枚举类型。

    • Field2.Value.ToString()错误:

        

      LINQ to Entities无法识别方法' System.String ToString()'方法,并且此方法无法转换为商店表达式。**


    • 这是(LocalDb)\ MSSQLLocalDB的限制吗?

    • 2005年以后这种事情是不允许的?

    • 可以选择激活/停用隐式转换

    欢迎任何线索。

2 个答案:

答案 0 :(得分:0)

这可能有所帮助:

query.Select(l => l.s.Field1 + (l.s.Field2 ?? "").ToString()).ToList(); 

答案 1 :(得分:0)

我找到了问题所在。这是EntityFramework的简单版本问题:在我的测试中,我在6.0.0和生产6.1.3中。

抱歉