【问题标题】:C# call a SQL Server user defined function via Entity FrameworkC# 通过实体框架调用 SQL Server 用户定义函数
【发布时间】:2018-01-03 17:08:09
【问题描述】:

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

我能够在以前版本的 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)。

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

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

我将 .edmx 文件命名为 CustomersEF。

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

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

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

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

以下代码有效...

var cusDb = new customersEntities();

var custable = cusDb.customers;

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

var cusDb = new customersEntities();

var favfruit = cusDb.fngetfruit(1);

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

谢谢,

【问题讨论】:

  • 使用以前版本的c#?我觉得这难以置信。
  • 可能您需要将其作为函数导入?这可能有助于stackoverflow.com/a/32359095/2946329
  • 稍微绕道....在继续在任何地方使用 NOLOCK 提示之前,您可能会先阅读此内容。 blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere
  • @CamiloTerevinto 当我第一次学习实体框架的基础知识时,用户定义的函数才起作用。不是,他们似乎需要额外的步骤。
  • 对这个问题投了反对票的人需要一个拥抱!

标签: c# .net sql-server entity-framework


【解决方案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)开始支持表值用户定义函数。 Entity Framework Table-Valued Functions (TVFs) (EF5 onwards)

【讨论】:

  • 也许我使用的是支持标量值用户定义函数的 Linq-to-SQL。
猜你喜欢
  • 2011-08-20
  • 2019-12-17
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多