Tengo una función escalar de valor en mi DB:Cómo llamar función con valores escalares de LINQ a Entidades del lado del servidor
ALTER FUNCTION [dbo].[fx_fooFunct]
(@MyParam varchar(max))
RETURNS varchar(max)
AS
BEGIN
return @MyParam
END
Quiero llamar a esta función desde un LINQ a Entidades consulta y obtener la resultar en una variable:
let result = this.ObjectContext.ExecuteFunction<string>("SELECT dbo.fx_fooFunct(@MyParam)", new ObjectParameter("MyParam", "hello world")).FirstOrDefault()
embargo, cuando ejecuto el código, me sale este error:
LINQ to Entities does not recognize the method 'System.Data.Objects.ObjectResult`1[System.String] ExecuteFunction[String](System.String, System.Data.Objects.ObjectParameter[])' method, and this method cannot be translated into a store expression.
Otro yo nfo:
Esto es parte de una consulta que se ejecuta en el servidor.
Devolver todos los datos y usar LINQ to Objects no es una opción debido al rendimiento.
no estoy seguro de que tengo el tipo de retorno de la ExecuteFunction
correcta, pero no estoy seguro de qué más podría ser ... ¿qué estoy haciendo mal?
Editar
Con la ayuda de la respuesta de Ladislav Mrnka, aquí está la solución:
Crear método de ayuda exponer la función SQL:
public class CustomSqlFunctions
{
[EdmFunction("MyModel.Store", "fx_fooFunct")]
public static string FooFunct(string myParam)
{
throw new NotSupportedException("Direct calls not supported");
}
}
El LINQ ahora será la siguiente:
let result = CustomSqlFunctions.FooFunct("hello world")
Excelente, muchas gracias. He actualizado mi pregunta con la solución. – mcqwerty