如何从LINQ调用标量值函数到实体服务器端

mcq*_*rty 8 linq-to-entities user-defined-functions entity-framework-4 entity-framework-4.1

我的数据库中有一个标量值函数:

ALTER FUNCTION [dbo].[fx_fooFunct]
  (@MyParam varchar(max))
RETURNS varchar(max)
AS
BEGIN
  return @MyParam
END
Run Code Online (Sandbox Code Playgroud)

我想从LINQ to Entities查询中调用此函数,并将结果转换为变量:

let result = this.ObjectContext.ExecuteFunction<string>("SELECT dbo.fx_fooFunct(@MyParam)", new ObjectParameter("MyParam", "hello world")).FirstOrDefault()
Run Code Online (Sandbox Code Playgroud)

但是,当我执行代码时,我收到此错误:

LINQ to Entities无法识别方法'System.Data.Objects.ObjectResult`1 [System.String] ExecuteFunction [String](System.String,System.Data.Objects.ObjectParameter [])'方法,而且此方法不能翻译成商店表达.

其他信息:

这是在服务器上运行的所有查询的一部分.
由于性能原因,返回所有数据并使用LINQ to Objects不是一个选项.

我不确定我的返回类型ExecuteFunction是否正确,但我不确定它还能做什么......我做错了什么?

编辑
在Ladislav Mrnka的回答的帮助下,这是解决方案:

创建公开SQL函数的辅助方法:

public class CustomSqlFunctions
{
    [EdmFunction("MyModel.Store", "fx_fooFunct")]
    public static string FooFunct(string myParam)
    {
        throw new NotSupportedException("Direct calls not supported");
    }
} 
Run Code Online (Sandbox Code Playgroud)

LINQ现在应该是:

let result = CustomSqlFunctions.FooFunct("hello world")
Run Code Online (Sandbox Code Playgroud)

Lad*_*nka 9

你在EDMX中映射了你的功能吗?我猜你没有.

从设计器中的数据库向导运行更新,并在存储过程下选择要导入的SQL函数,并按照本文创建标记的辅助方法,EdmFunctionAttribute以公开LINQ-TO-Entities的SQL函数.

注意:code-first/fluent-API不支持SQL函数.您需要使用EDMX映射.

ExecuteFunction用于调用EDMX中映射的功能 - 它需要映射功能的名称(存储过程的函数导入).MSDN说,它也可以调用映射函数,但我不知道如何 - 它调用函数导入和SQL函数导入没有任何.