Я использую VS2010, Entity Framework 4.0 и Advantage v. 10 в своем приложении. Я пытаюсь сделать UDF, который я определил в своей базе данных Advantage, доступной для кода моего приложения. Дизайнер не показывает 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; Нативеррор = 2117; [Решения iAnywhere][Advantage SQL Engine]Неожиданный токен: имя скалярной функции не должно быть разделено.
Он отлично работает, если я запускаю сгенерированный SQL в Advantage Data Architect и исправляю имя функции следующим образом:
Test("Project3"."PartID") AS "C4"
Есть ли способ указать Entity Framework для создания правильного SQL? Я что-то не так делаю в определении функции в SSDL?
Заранее спасибо.