2010-08-24 2 views
1

Я использую VS2010, Entity Framework 4.0 и Advantage v. 10 в своем приложении. Я написал оператор Linq-to-Entities (L2E), который пытается преобразовать нулевой числовой (десятичный) тип в десятичный. Простой оператор может выглядеть следующим образом:Сущность framework + база преимуществ: преобразование нулевых числовых типов

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 column: x) Ошибка выполнения запроса AdsCommand.

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

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

+0

prob это изменение не работает. Однако вы что-то пробовали. выберите тест. 0 Возможно, мне не хватает роли, но если вы можете это перевести, это может сделать работу. Иногда изменение синтаксиса заставляет работать. – zeeshanhirani

+0

zeeshanhirani, да, я попробовал ??? синтаксис. К сожалению, это не сработало. Использование функции IsNull, предложенная LanceSc, является жизнеспособным решением. Спасибо, в любом случае! – user429994

ответ

1

Как Craig упомянуто это ошибка в 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

Спасибо, LanceSc. Это сработало отлично. – user429994

0

Ваш поставщик EF создал плохой SQL, и это ошибка в провайдере.

Однако, вы, вероятно, может работать вокруг него:

var x = entities.Tests 
       .Select(t => t.ValueA) 
       .AsEnumerable() 
       .Select(t => t.GetValueOrDefault()); 
Смежные вопросы