C# 转换方法&引用;无法将类型上指定的方法转换为LINQ to Entities存储表达式";

C# 转换方法&引用;无法将类型上指定的方法转换为LINQ to Entities存储表达式";,c#,linq,entity-framework,postgresql,C#,Linq,Entity Framework,Postgresql,我已经将Entity6.0项目从SQLServer迁移到PostGreSQL。在SQL Server中,对我的查询进行的这种转换过去可以正常工作 模块.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

我已经将Entity6.0项目从SQLServer迁移到PostGreSQL。在SQL Server中,对我的查询进行的这种转换过去可以正常工作

模块.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 )
    }
);
[System.Data.Entity.DbFunctionAttribute( "Business.Database", "ToInt32" )]
public static Int32 ToInt32( Boolean Val )
{
    return System.Convert.ToInt32( Val );
}
状态是一个布尔类型

DB_Function.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 )
    }
);
[System.Data.Entity.DbFunctionAttribute( "Business.Database", "ToInt32" )]
public static Int32 ToInt32( Boolean Val )
{
    return System.Convert.ToInt32( Val );
}
但是,当我迁移到PostgreSQL(并因此更改了我的EDMX)时,这些类型的转换不再执行:

类型上的指定方法“Int32到Int32(布尔)” “DB_函数+转换”无法转换为LINQ to实体 存储表达式

这个错误与PostGre有关(比如int4而不是int32),或者我遗漏了什么


提前感谢。

要了解我们可以在LINQ to enities内部使用什么类型的函数,请浏览以下链接:

现在,在这个特殊的例子中,我们在LINQtoEntites端有一个函数,它无法转换为SQL查询,因此引发了异常。因此,通过删除该函数,它可以完美地工作

返回( 从objDB.Modules中的m orderby m.ID 选择新的 { ID=m.ID, Name=m.Name, 状态=m。状态=真?1:0 }
);

只要删除你的函数,如果你的值不可为空,它就会工作

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
   }
);

这不是对您问题的回答,但如果
Status
是布尔值,为什么要转换为
Int32
?因为我需要0和1。在SQL Server中,没有布尔类型,只有位,因此此转换仅用于位值变为int32。虽然在PostGre中有一个布尔类型,但是所有的代码都是用0或1编程的,所以我尽量不彻底修改它。你能把方法改成
return Val吗?1 : 0;相反?我尝试了这个,但仍然返回相同的错误消息。现在我有了更多的怀疑,我认为你的解决方案会非常合适。可能问题出在方法的调用上。无论如何,谢谢你。编辑:我已经修改了linq本身并且可以工作。感谢lota没有更改主题,但是如果您在SQLServer中使用了一个位字段,那么它会在Entity Framework中将它映射到一个布尔值。如果postgres有一个名为“ToInt32”的函数,那么你的函数应该可以工作(我认为,从来没有将postgres与EF一起使用过)。您没有在数据库中创建该函数吗?虽然这可能会回答问题,但如果您在代码中包含注释和/或包含附加解释,而不是仅提供代码答案,则会对提问者有所帮助。附加解释将改进您的答案。是的,请记住。。下次以后。。当前正在编辑带有注释的答案:)使用此选项,将显示相同的消息:“LINQ to Entities不识别方法‘Int32 ToInt32(布尔)’方法,并且此方法无法转换为存储表达式。”这正是我创建我在上面注释的“ToInt32(布尔值)”方法的原因。使用这些方法,它可以在SQL上工作,但不能在PostGre上工作(或者至少不能在我为PostGre工作而创建的新修改的EDMX上工作)。无论如何,谢谢你。