Oracle 関数の 1 つのラッパーとして使用されている関数をマップしました (実際には、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) を使用して、実際に DB に送信されているクエリを確認してみました。傍受されたクエリは次のとおりです。
SELECT Translate('test' /*@DataToTranslate*/ using char_cs) AS ResultData FROM dual
(よく見える)
しかし、私のアプリケーションは次のエラーで停止します: ORA-00936: 式がありません
インターセプトされたクエリを VS2010 のサーバー エクスプローラー クエリ ウィンドウにコピー アンド ペーストすると、機能します。DBは正しいデータを返します!
では、どこに問題があるのでしょうか。私の場合、コードとクエリ ウィンドウの違いは何ですか? 私は彼らが同じプロバイダーを使用していると思っていました...
どうもありがとうございました!
編集:
標準の Inet-sniffer を使用して、クエリの実行時にソケットとインターネット経由で送信される実際のデータを確認しました。
そして、それは最初のものと同じではありません!それはまさに私のソース SQL クエリです。
SELECT Translate(@DataToTranslate using char_cs) AS ResultData FROM dual
そのパラメータが認識されていないようですが、なぜですか?