entity-framework-4 - 如何从 LINQ to Entities 服务器端调用标量值函数

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

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

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/

相关文章:

entity-framework-4 - 首先在 CTP4 代码中使用 CreateSourceQuery

entity-framework-4.1 - EF 4.1 code-first SQL ce 4.0 更新集合异常

c# - EF 4.1 引用完整性错误

c# - 如何在 Entity Framework 4 Entitydesigner 中正确设置两个对象之间的关联?

entity-framework-4 - MVC 将 View 模型映射到 POCO

Linq IQueryable.Any() 用法

asp.net-mvc - EntityFunctions.CreateDateTime 与实体的 linq 中的闰年问题

entity-framework-4.1 - map 很多 :optional relationships from multiple entity types EF CodeFirst

mysql - 使用 MySQL 设置 .NET MVC3

linq-to-entities - Linq to Entities - 左外连接