1

アプリケーションでVS2010、Entity Framework 4.0、およびAdvantagev。10を使用しています。null許容の数値(10進数)型を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(行:x列:x)AdsCommandクエリの実行に失敗しました。

結果を列挙してクライアント側で変換を行う以外に、これを回避する方法はありますか?L2EステートメントでAdvantageに「0」の精度とスケールを伝える方法がわかりません。

前もって感謝します。

4

2 に答える 2

1

Craigが述べたように、これはAdvantage EntityFrameworkProviderのバグです。これは、Advantage EntityFrameworkProviderの次のサービスリリースで修正される予定です。

別の可能な回避策は、データベースの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" );
        }
     }
于 2010-08-25T22:54:34.677 に答える
0

EFプロバイダーが不正なSQLを生成しましたが、これはプロバイダーのバグです。

ただし、おそらくそれを回避することができます:

var x = entities.Tests
                .Select(t => t.ValueA)
                .AsEnumerable()
                .Select(t => t.GetValueOrDefault());
于 2010-08-24T21:01:01.797 に答える