C# 通过实体框架调用 SQL Server 用户定义函数

cod*_*000 2 .net c# sql-server entity-framework

我不敢相信我必须问这个问题,但我被卡住了。我只是花了三个小时试图弄清楚这一点,但我被卡住了。

我能够在以前版本的 C# 中做到这一点,但别名我被卡住了。

在我继续之前,这里是我正在处理的堆栈...

  • 视觉工作室 2012
  • SQL Server 2012
  • .NET Framework 3.5(我尝试过不同版本的结果相同)。

考虑以下 SQL 代码:

create table dbo.customers
(
    customerid int not null identity(1,1), 
    fname varchar(50), 
    lname varchar(50), 
    favfruit varchar(30)
)
go

alter table customers 
   add constraint customers_customerid_pk primary key (customerid)

insert into customers(Fname, lname, favfruit) 
values ('Melissa', 'Smith', 'Apple'),
       ('Jennifer', 'Jones', 'Pear'),
       ('Jill', 'Brown', 'Apple')       

create function dbo.fngetfruit(@customerid int)
returns varchar(30)
as
begin
    declare @favfruit varchar(30)

    select @favfruit = favfruit
    from dbo.customers c (nolock)
    where c.customerid = @customerid

    return @favfruit
end

select dbo.fngetfruit(2)
Run Code Online (Sandbox Code Playgroud)

这段代码创建了一个表(customers)和一个用户定义的函数(fngetfruit)。此函数采用 customerid 并从 customer 表中返回该客户最喜欢的水果。

到现在为止还挺好。一切正常。

现在我想使用实体框架从 C# 控制台应用程序调用我的函数 (fngetfruit)。

创建一个新的控制台应用程序。

在解决方案资源管理器的控制台应用程序内部,右键单击应用程序名称。选择添加 ==> 新项目 ==> ADO.NET 实体数据模型。

我将我的 .edmx 文件命名为 CustomersEF。

选择从数据库生成。设置您的连接。我采用了customersEntities 的默认实体连接名称。点击下一步。

在选择您的数据库对象和设置屏幕中,选择客户表和 fngetfruit 函数。单击完成。

接下来,您将进入一个显示数据库图表的屏幕。就我而言,我只有一个名为 customer 的表。该功能无处可寻。

打开控制台应用程序的主要功能。

以下代码有效...

var cusDb = new customersEntities();

var custable = cusDb.customers;
Run Code Online (Sandbox Code Playgroud)

但是下面的代码不起作用..

var cusDb = new customersEntities();

var favfruit = cusDb.fngetfruit(1);
Run Code Online (Sandbox Code Playgroud)

为什么我无法访问我的功能?我错过了什么?就像我说的,上述步骤在早期版本中对我有用。

谢谢,

Dav*_*oft 5

这是一个标量值的用户定义函数。EF 从未直接支持这些。向您的 DBContext 添加一个方法来调用标量值 UDF 是微不足道的。就像是:

public string GetFruit(int customerId)
{
    return Database.SqlQuery<string>("select dbo.fngetfruit(@customerId) fruit", new System.Data.SqlClient.SqlParameter("@customerID", customerId)).Single();
}
Run Code Online (Sandbox Code Playgroud)

EF 从版本 5(需要 .NET 4x)开始支持表值用户定义函数。实体框架表值函数 (TVF)(EF5 以上)