在 Entity Framework Core 2.0 中执行存储过程

Executing Stored Procedure in Entity Framework Core 2.0

有一个场景来执行存储过程并读取 EF Core 中的 return 值,return 是一个值。

我尝试使用此代码,但这不起作用。我知道 ExecuteSqlCommand 不适用于 select,只能用于更新数据库。

var test =  context.Database.ExecuteSqlCommand("SPName");

存储过程只有一个 select 语句,如 Select 'somevalue'

正在寻找任何替代方法来获取存储过程 returns.

的数据

查看 MS 的文档:https://docs.microsoft.com/en-us/ef/core/querying/raw-sql

var blog = context.Blogs
    .FromSql("EXECUTE dbo.GetMostPopularBlogs")
    .SingleOrDefault();

他们有一个 git 充满示例的回购协议:https://github.com/aspnet/EntityFramework.Docs/blob/master/samples/core/Querying/Querying/RawSQL/Sample.cs

要在 EF Core 中使用存储过程,请观看此视频:https://www.youtube.com/watch?v=bX3BPSbvofE

DbCommand cmd = ctx.Database.GetDbConnection().CreateCommand();
cmd.CommandText = "SPName";
cmd.CommandType = CommandType.StoredProcedure;

    if (cmd.Connection.State != ConnectionState.Open)
    {
        cmd.Connection.Open();
    }

return await cmd.ExecuteNonQueryAsync();

这里有一个 post: https://nodogmablog.bryanhogan.net/2016/07/entity-framework-core-and-calling-a-stored-proceduce/#comment-60582

可以用下面的代码解决我的问题。这是基于以下回复中给出的建议。

using (var command = context.Database.GetDbConnection().CreateCommand())
    {
        command.CommandText = "StoredProcedureName";
        command.CommandType = CommandType.StoredProcedure;

        context.Database.OpenConnection();

        var dataReader = command.ExecuteReader();

        if (dataReader.Read())
        {
            string _test = dataReader.GetString(dataReader.GetOrdinal("ColumnName"));
        }
    }

请按照以下步骤操作:

步骤 1: 创建模型 class

  public class SP_GetService
  {
        [Key]
        public int ServiceId { get; set; }
        public string ServiceAcronym { get; set; }
        public string ServiceDescription { get; set; }
    }

步骤 2: 在上下文文件中创建数据库集

public virtual DbSet<SP_GetService> SP_GetServices { get; set; }

Step3 : 执行程序

using (var _context = new SampleContext())
{
 var data = _context.SP_GetServices.FromSql("EXECUTE GetService @Param={0}", "value").ToList();
}