структура сущности + база данных преимуществ: преобразование обнуляемых числовых типов - PullRequest
1 голос
/ 25 августа 2010

Я использую VS2010, Entity Framework 4.0 и Advantage v. 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] [Advantage SQL Engine] Недопустимый аргумент для скалярной функции: CAST - должен указывать как точность, так и масштаб.- Расположение ошибки в операторе SQL: xxx (строка: x столбец: x) Не удалось выполнить запрос AdsCommand.

Есть ли способ обойти этот недостаток перечисления результатов и выполнения преобразования на стороне клиента?Я не уверен, как сказать Advantage точность и масштаб «0» с помощью оператора L2E.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 26 августа 2010

Как упомянул Крейг, это ошибка в провайдере Advantage Entity Framework. Это будет исправлено в следующем выпуске службы поставщика Advantage Entity Framework.

Другой возможный обходной путь - открыть функцию 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" );
        }
     }
0 голосов
/ 25 августа 2010

Ваш провайдер EF сгенерировал неверный SQL, и это ошибка в провайдере.

Однако вы, вероятно, можете обойти это:

var x = entities.Tests
                .Select(t => t.ValueA)
                .AsEnumerable()
                .Select(t => t.GetValueOrDefault());
...