Как вызвать скалярную функцию из LINQ to Entities на стороне сервера

У меня есть скалярная функция в моей базе данных:

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")
8
задан mcqwerty 9 August 2011 в 19:36
поделиться