实体框架+优势数据库:转换可空数字类型

时间:2010-08-24 20:33:10

标签: entity-framework-4 advantage-database-server

我在我的应用程序中使用VS2010,Entity Framework 4.0和Advantage v.10。我编写了一个Linq-to-Entities(L2E)语句,试图将可以为空的数字(十进制)类型转换为十进制。一个简单的陈述可能如下:

var x = (from test in entities.Tests
         select test.ValueA.HasValue ? test.ValueA.Value : 0);

但是,我收到以下错误:

System.Data.EntityCommandExecutionException:执行命令定义时发生错误。有关详细信息,请参阅内部异常---> Advantage.Data.Provider.AdsException:错误7200:AQE错误:状态= S0000; NativeError = 2159; [iAnywhere Solutions] [Advantage SQL Engine]标量函数的无效参数:CAST - 必须同时指定精度和小数位数。 - SQL语句中的错误位置是:xxx(line:x column:x)AdsCommand查询执行失败。

有没有办法解决这个结果并在客户端进行转换?我不知道如何通过L2E声明告诉Advantage“0”的精度和规模。

提前致谢。

2 个答案:

答案 0 :(得分:1)

正如Craig所说,这是Advantage Entity Framework Provider中的一个错误。它将在Advantage Entity Framework Provider的下一个服务版本中修复。

另一种可能的解决方法是公开数据库的IsNULL函数。将以下内容添加到SSDL中。

 <Function Name="IsNull" ReturnType="numeric" Aggregate="false" BuiltIn="true" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion">
    <Parameter Name="Value" Type="numeric" Mode="In"/>
    <Parameter Name="Default" Type="integer" Mode="In"/>
 </Function>

然后添加以下CLR存根函数。

  public static class MyFunctions
     {

     [EdmFunction( "Model.Store", "IsNull" )]
     public static decimal IsNull( decimal? Value, int? Default )
        {
        throw new InvalidOperationException( "Call from within an L2E query" );
        }
     }

答案 1 :(得分:0)

您的EF提供程序生成了错误的SQL,这是提供程序中的错误。

但是,你可以解决它:

var x = entities.Tests
                .Select(t => t.ValueA)
                .AsEnumerable()
                .Select(t => t.GetValueOrDefault());