小编mcq*_*rty的帖子

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

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

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)

linq-to-entities user-defined-functions entity-framework-4 entity-framework-4.1

8
推荐指数
1
解决办法
1万
查看次数