我已经映射了一些函数,它被用作其中一个Oracle函数的包装器(我真的需要从我的LINQ中调用该Oracle函数)。
我的映射看起来像(存储模型):
<Function Name="RunTranslate" IsComposable="false" BuiltIn="false">
<CommandText>
SELECT Translate(@DataToTranslate using char_cs) AS ResultData FROM dual
</CommandText>
<Parameter Name="DataToTranslate" Type="char" Mode="In" />
</Function>
并
<FunctionImport Name="OracleTranslate" ReturnType="Collection(String)">
<Parameter Name="DataToTranslate" Mode="In" Type="String" />
</FunctionImport>
我尝试以这种方式使用代码:
using (var context = new TestEntities())
{
....
var result = from myData in context.OracleTranslate("test")
select myData; // Error ORA-00936!
....
}
我尝试使用Entity Framework Profiler(EFProf)来查看实际发送到数据库的查询。截获的查询是下一个:
SELECT Translate('test' /*@DataToTranslate*/ using char_cs) AS ResultData FROM dual
(看起来很好)
但我的应用程序因下一个错误而停止: ORA-00936:表达式缺失
如果我将截获的查询复制粘贴到VS2010的服务器资源管理器查询窗口中 - 它可以工作! DB向我返回正确的数据!
那么,问题出在哪里?在我的情况下代码和查询窗口有什么区别?我以为他们使用相同的提供商等...
非常感谢!
修改:
我刚刚使用标准的Inet-sniffer来检查在运行查询时通过套接字和Internet发送的真实数据。
与第一个不一样!这正是我的源SQL查询:
SELECT Translate(使用char_cs的@DataToTranslate)AS ResultData FROM dual
看来,该参数无法识别,但为什么?
答案 0 :(得分:1)
我找到了解决方案,希望这些信息可以帮到某人:
DataToTranslate参数应使用冒号(“:DataToTranslate”)映射,而不是“@”。
另一个重要经验(对我来说):实体框架分析器(EFProf)显示它想要的东西,而不是真实数据 - 使用像Wireshark这样的TCP嗅探器来查看数据要好得多。