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