【问题标题】:Convert Method. "The specified method on the type cannot be translated into a LINQ to Entities store expression"转换方法。 “无法将类型上的指定方法转换为 LINQ to Entities 存储表达式”
【发布时间】:2015-08-27 06:23:47
【问题描述】:

我已将我的 entity 6.0 项目从 SQL Server 迁移到 PostGreSQL。使用 SQL Server,对我的查询进行的这种转换通常可以正常工作

Module.cs

return (
    from m in objDB.Modules
    orderby m.ID
    select new
    {
        ID = m.ID,
        Name = m.Name,
        Status = DB_Function.Convert.ToInt32( m.Status )
    }
);

PS:状态是布尔类型

DB_Function.cs

[System.Data.Entity.DbFunctionAttribute( "Business.Database", "ToInt32" )]
public static Int32 ToInt32( Boolean Val )
{
    return System.Convert.ToInt32( Val );
}

但是,当我迁移到 PostgreSQL(并因此更改了我的 EDMX)时,这些类型的转换不再执行:

类型上的指定方法'Int32 ToInt32(Boolean)' 'DB_Function+Convert' 无法转换为 LINQ to Entities 存储表达式。

此错误与 PostGre 相关(如 int4 而不是 int32)或者我遗漏了什么?

提前致谢。

【问题讨论】:

  • 不是您问题的答案,但是如果 Status 是布尔值,您为什么要转换为 Int32
  • 因为我需要它与0和1。在SQL Server中,没有boolean类型,只有bit,所以这个转换只是为了bit值变成int32。虽然在 PostGre 中有一个 boolean 类型,但所有代码都被编程为使用 0 或 1,所以我尽量不要大幅修改它。
  • 你能把方法改成return Val ? 1 : 0;吗?
  • 我尝试了这个,但仍然返回相同的错误消息。现在我有更多疑问,我认为您的解决方案会像手套一样适合。也许问题出在方法的调用上。无论如何,谢谢。编辑:我已经修改了 linq 本身并且可以工作。非常感谢
  • 不要改变主题,但如果你在 Sql Server 中使用了位字段,它会通过将它映射到实体框架中的布尔值。而且您拥有的功能应该可以工作(我认为,从未将 postgres 与 EF 一起使用)IF postgres 有一个名为“ToInt32”的功能。你没有在数据库中创建那个函数吗?

标签: c# linq entity-framework postgresql


【解决方案1】:

要了解我们可以在 LINQ to Enitities 中使用哪些类型的函数:请查看以下链接: linq to entities doesn't recognize a method

现在,在这种特殊情况下,我们在 LINQ to Entites 端有一个函数,该函数无法转换为 SQL 查询,因此引发了异常。所以通过删除它完美地工作的功能。

返回 ( 来自 objDB.Modules 中的 m orderby m.ID 选择新的 { ID = m.ID, 姓名 = m.姓名, 状态 = m.状态 == 真? 1 : 0 } );

【讨论】:

  • 虽然这可能会回答问题,但如果您在代码中包含 cmets 和/或包含附加说明而不是提供仅代码的答案,这将对提问者有所帮助。
  • 额外的解释会改善你的答案。
  • 肯定会记住.. 下次以后.. 目前正在编辑带有评论的答案:)
【解决方案2】:

只需删除您的函数,如果您的值不可为空,它将起作用

return (
from m in objDB.Modules
orderby m.ID
select new
   {
    ID = m.ID,
    Name = m.Name,
    Status = Convert.ToInt32( m.Status )
   }
);

如果它可以为空,则需要检查它是否具有值:

return (
from m in objDB.Modules
orderby m.ID
select new
   {
    ID = m.ID,
    Name = m.Name,
    Status =m.Status.HasValue? Convert.ToInt32( m.Status ):0
   }
);

【讨论】:

  • 这样,会显示相同的消息:" LINQ to Entities 无法识别方法 'Int32 ToInt32(Boolean)' 方法,并且此方法无法转换为存储表达式。" 这正是我创建上面评论的 "ToInt32( Boolean Val )" 方法的原因。使用这些方法,它适用于 SQL,但不适用于 PostGre(或者至少,不适用于我必须为 PostGre 创建的新修改的 EDMX)。还是谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
相关资源
最近更新 更多