如何从.net核心实体框架使用表值参数调用存储过程

时间:2019-02-20 09:17:29

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

我有一个带有表值参数的存储过程。 我必须从.net核心中的实体框架中调用它。

我在上下文对象上找不到任何API。

我已经尝试过使用ADO.net API,并且可以使用,但是现在我必须从.net核心中的EF调用它。我必须调用存储过程来返回必须捕获的结果。

我的样本SP如下

CREATE PROCEDURE [dbo].[GetMyData] 
@MyRequest [dbo].[MyRequestType] Readonly
As 
BEGIN

--Its sample SP thats why returned request table as it is    
select * from @MyRequest


END

MyRequestType是用户定义的表类型

其结构如下

CREATE TYPE [dbo].[MyRequestType] AS TABLE(
    [Id] [numeric](22, 8) NULL,
    [Col1] [bigint] NULL,
    [Col2] [numeric](22, 8) NULL 
) 

我正在EF核心中使用代码优先方法

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

只需更新ef core 3+

您可以使用FromSqlRawFromSqlInterpolated

var query = context.DnoFacts.FromSqlRaw("EXEC [dbo].[GetMyData] {0} ,{1}", otherParam, TableValueParameter)



var query = context.DnoFacts.FromSqlInterpolated($"EXEC [dbo].[GetMyData] {otherParam}, {TableValueParameter}")

答案 1 :(得分:1)

最后,我可以从使用EF核心的.net核心服务中调用表值参数存储过程

我创建了伪造的响应域模型

   public class MyResponse
    {
        public int Id { get; set; }
        public int Col1{ get; set; }
        public int Col2 { get; set; } 
    }

之所以称其为Fake Domain Model,是因为Domain模型通常是CLR类中的表表示形式,但是我在SQL Server中没有这样的表。

然后我在Context类下面添加了此属性

public class MyQueryDbContext : DbContext
{
  public virtual DbSet<MyResponse> Data { get; set; }
    .
    .
    .
}

然后需要为请求参数列表创建数据表,如下所示

 DataTable table = new DataTable();
 table.Columns.Add("Id", typeof(int));
 table.Columns.Add("Col1", typeof(int));
 table.Columns.Add("Col2", typeof(int));

然后我使用EF从.net核心API调用存储过程,并将数据表作为参数传递,如下所示

 var parameter = new SqlParameter("@MyRequest", SqlDbType.Structured);
 parameter.Value = table;
 parameter.TypeName = "[dbo].[MyRequestType]" // My Table valued user defined type
var response=_context.Data
                     .FromSql("EXEC [dbo].[GetMyData] @MyRequest", parameter)
                     .ToList()

您将在响应变量中得到响应。