我的数据库中有一个标量值函数:
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 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.
其他信息:
这是服务器上运行的查询的一部分。
由于性能原因,返回所有数据并使用 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");
}
}
LINQ 现在应该显示为:
let result = CustomSqlFunctions.FooFunct("hello world")
最佳答案
您的函数是否已映射到 EDMX 中?我想你不会。
在设计器中运行从数据库更新向导,并在存储过程下选择要导入的 SQL 函数并遵循 this article创建标有 EdmFunctionAttribute
的辅助方法,以公开 LINQ-TO-Entities 的 SQL 函数。
注意:代码优先/流畅 API 不支持 SQL 函数。您需要使用 EDMX 进行映射。
ExecuteFunction
用于调用 EDMX 中映射的功能 - 它需要映射功能的名称(存储过程的函数导入)。 MSDN 说它也可以调用映射函数,但我不知道如何调用 - 它调用函数导入,而 SQL 函数导入没有任何函数。
关于entity-framework-4 - 如何从 LINQ to Entities 服务器端调用标量值函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6998957/