我在我的应用程序中使用VS2010、Entity Framework4.0和Advantage v10。我正在尝试使我在Advantage DB中定义的UDF可用于我的应用程序代码。designer并不像我所期望的那样,在"Update Model from Database“向导中的stored procs下显示UDF。因此,我手动将UDF添加到SSDL中,如下所示:
<Function Name="Test" ReturnType="numeric" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion">
<Parameter Name="PartID" Type="integer" Mode="In"/>
</Function>我还添加了一个CLR方法存根:
[EdmFunction("namespace.Store", "Test")]
public static decimal Test(int partID)
{
throw new InvalidOperationException("Call from within an L2E query");
}我可以在Linq-to-Entities语句中看到这个函数;但是,生成的SQL是无效的。使用ToTraceString时,UDF调用如下所示:
"namespace.Store"."Test"("Project3"."PartID") AS "C4"这会给我以下错误:
System.Data.EntityCommandExecutionException:执行命令定义时出错。有关详细信息,请参阅内部异常。-> Advantage.Data.Provider.AdsException: Error 7200: AQE Error:状态= 42000;NativeError = 2117;iAnywhere SolutionsUnexpected token:标量函数名不能分隔。
如果我在Advantage Data Architect中运行生成的SQL并像这样更正函数名,它就可以正常工作:
Test("Project3"."PartID") AS "C4"有没有办法让Entity Framework生成正确的SQL?我是不是在SSDL中的函数定义中做错了什么?
提前谢谢。
发布于 2010-08-26 07:51:25
您需要将您的function元素更改为具有BuiltIn="true"。Advantage SQL语法中不包括用户定义的函数。
发布于 2010-08-25 15:15:26
看起来不错。我唯一建议的是将小数改为可空,但我怀疑这是否能解决问题,因为那样你会看到一个不同的异常。值得一试。我之前确实谈过这个函数。
http://weblogs.asp.net/zeeshanhirani/archive/2010/04/08/calling-user-defined-database-function-from-linq.aspx
https://stackoverflow.com/questions/3560957
复制相似问题