0

アプリケーションで VS2010、Entity Framework 4.0、および Advantage v. 10 を使用しています。Advantage DB で定義した UDF をアプリケーション コードで使用できるようにしようとしています。デザイナは、[データベースからモデルを更新] ウィザードでストアド プロシージャの下に 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: エラー 7200: AQE エラー: 状態 = 42000; NativeError = 2117; [iAnywhere ソリューション][Adv​​antage SQL Engine]予期しないトークン: スカラー関数名を区切ることはできません。

生成された SQL を Advantage Data Architect で実行し、関数名を次のように修正すると、問題なく動作します。

     Test("Project3"."PartID") AS "C4"

Entity Frameworkに正しいSQLを生成するように指示する方法はありますか? SSDL の関数の定義に何か問題がありますか?

前もって感謝します。

4

2 に答える 2

0

関数要素を に変更する必要がありますBuiltIn="true"。ユーザー定義関数は、Advantage SQL 文法では引用されません。

于 2010-08-25T23:51:25.153 に答える
0

よさそうです。私がお勧めする唯一のことは、10進数をnull可能に変更することですが、別の例外が表示されるため、問題が解決するかどうかは疑問です。それは試みに値します。私はしばらく前に機能をカバーしました。

http://weblogs.asp.net/zeeshanhirani/archive/2010/04/08/calling-user-defined-database-function-from-linq.aspx

于 2010-08-25T07:15:26.113 に答える