У меня есть скалярная функция в моей базе данных:
ALTER FUNCTION [dbo].[fx_fooFunct]
(@MyParam varchar(max))
RETURNS varchar(max)
AS
BEGIN
return @MyParam
END
Я хочу вызвать эту функцию из запроса LINQ to Entities и получить результат в переменной :
let result = this.ObjectContext.ExecuteFunction<string>("SELECT dbo.fx_fooFunct(@MyParam)", new ObjectParameter("MyParam", "hello world")).FirstOrDefault()
Но когда я выполняю код, я получаю следующую ошибку:
LINQ to Entities не распознает метод 'System.Data.Objects.ObjectResult`1 [System.String] ExecuteFunction [String] (System.String, System.Data.Objects.ObjectParameter []) ', и этот метод не может быть преобразованным в выражение хранилища.
Дополнительная информация:
Это часть всего запроса, выполняемого на сервере.
Возврат всех данных и использование LINQ to Objects не является вариантом из-за производительности.
Я не уверен, что у меня правильный тип возвращаемого значения ExecuteFunction
, но я не уверен, что еще возможно...
Что я делаю не так?
Изменить
С помощью ответа Ладислава Мрнки вот решение:
Создать вспомогательный метод, раскрывающий функцию SQL:
public class CustomSqlFunctions
{
[EdmFunction("MyModel.Store", "fx_fooFunct")]
public static string FooFunct(string myParam)
{
throw new NotSupportedException("Direct calls not supported");
}
}
Теперь LINQ должен выглядеть так:
let result = CustomSqlFunctions.FooFunct("hello world")