我在我的应用程序中使用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”的精度和规模。
提前致谢。
答案 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());