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

C# C通过实体框架调用SQL Server用户定义函数,c#,.net,sql-server,entity-framework,C#,.net,Sql Server,Entity Framework,我不敢相信我会问这个问题,但我被卡住了。我花了三个小时想弄明白,我被卡住了 我可以在以前的C版本中做到这一点,但我被卡住了 在我继续之前,这里是我正在处理的堆栈 Visual Studio 2012 SQL Server 2012 .NET Framework 3.5我在不同版本上进行了尝试,结果相同。 考虑以下SQL代码: create table dbo.customers ( customerid int not null identity(1,1), fname var

我不敢相信我会问这个问题,但我被卡住了。我花了三个小时想弄明白,我被卡住了

我可以在以前的C版本中做到这一点,但我被卡住了

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

Visual Studio 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)
此代码创建一个表customers和一个用户定义的函数fngetfruit。此函数获取customerid并从customer表中返回该客户最喜欢的水果

到目前为止还不错。一切正常

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

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

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

我将.edmx文件命名为CustomersEF

选择从数据库生成。建立你的连接。我采用CustomerEntities的默认实体连接名称。单击下一步

在选择数据库对象和设置屏幕中,选择customers表和FNGETFROUT函数。单击Finish

接下来,您将进入一个显示数据库关系图的屏幕。在我的例子中,我只有一个名为customer的表。该函数在哪里都找不到

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

下面的代码可以工作

var cusDb = new customersEntities();

var custable = cusDb.customers;
但是,以下代码不起作用

var cusDb = new customersEntities();

var favfruit = cusDb.fngetfruit(1);
为什么我不能访问我的功能?我错过了什么?正如我所说,上述步骤在早期版本中对我有效


谢谢,

这是一个标量值的用户定义函数。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();
}

EF支持表值用户定义函数,因为版本5需要.NET 4x

这是一个标量值的用户定义函数。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();
}

EF支持表值用户定义函数,因为版本5需要.NET 4x

使用以前版本的c?我觉得很难相信。也许你需要将它作为函数导入?这可能有助于稍微绕道……在继续到处使用NOLOCK提示之前,您可能会阅读这篇文章@Camiloteriento当我第一次学习实体框架的基础知识时,用户定义的函数刚刚开始工作。似乎他们还需要一个额外的步骤。谁否决了这个问题,谁就需要一个拥抱!使用以前版本的c?我觉得很难相信。也许你需要将它作为函数导入?这可能有助于稍微绕道……在继续到处使用NOLOCK提示之前,您可能会阅读这篇文章@Camiloteriento当我第一次学习实体框架的基础知识时,用户定义的函数刚刚开始工作。似乎他们还需要一个额外的步骤。谁否决了这个问题,谁就需要一个拥抱!可能我使用的是支持标量值用户定义函数的linqtosql,可能我使用的是支持标量值用户定义函数的linqtosql。