使用 EF Core 获取存储过程的输出参数值?

Rah*_*ury 5 c# entity-framework entity-framework-core asp.net-core

我在我的应用程序中使用 Asp.net 核心和 EF 核心。基本上我想从单个存储过程中获取多个结果集。试图搜索它过去 2 天没有这样的运气。试图找出解决方法来解决它..

这是我的存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[usp_CustomerAll_sel]
    @SomeOutput int OUT
AS
BEGIN
    SET NOCOUNT ON;

    SELECT * 
    FROM [dbo].[Customer]

    SELECT @SomeOutput = @@rowcount + 25 --This number 25 is a variable from a complex query but always an integer
END
Run Code Online (Sandbox Code Playgroud)

我在那个表中有 2 条记录,所以基本上它应该返回一个客户类型的表,输出参数应该返回 27..

现在从我的 .net 代码中我到目前为止所尝试的

[HttpGet]
public async Task<Tuple<IEnumerable<Customer>, int>> GetAllCustomer()
{
    var votesParam = new SqlParameter
            {
                ParameterName = "SomeOutput",
                Value = -1,
                Direction = ParameterDirection.Output
            };

    var y = await _customerContext.Customers.FromSql("usp_CustomerAll_sel @SomeOutput out", votesParam).ToArrayAsync();

    return new Tuple<IEnumerable<Customer>, int>(y, (int)votesParam.Value);
}
Run Code Online (Sandbox Code Playgroud)

上面的一个返回了我的列表,但我没有从 DB 获取输出参数的值.(int)votesParam.Value显示为空

现在,如果我使用ExecuteNonQueryAsync,那么我将获得输出参数但不是实际数据

private async Task ExecuteStoredProc()
{
    DbCommand cmd = _customerContext.Database.GetDbConnection().CreateCommand();

    cmd.CommandText = "dbo.usp_CustomerAll_sel";
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add(new SqlParameter("@SomeOutput", SqlDbType.BigInt) { Direction = ParameterDirection.Output, Value = -1 });

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

    await cmd.ExecuteNonQueryAsync();

    long SomeOutput = (long)cmd.Parameters["@SomeOutput"].Value;
}
Run Code Online (Sandbox Code Playgroud)

有没有办法同时获取结果集和输出参数并作为元组返回?

当我只输入硬编码值时,它看起来像

[HttpGet]
public async Task<Tuple<IEnumerable<Customer>, int>> GetAllCustomer()
{
    var votesParam = new SqlParameter
    {
        ParameterName = "SomeOutput",
        Value = -1,
        Direction = ParameterDirection.Output
    };

    var y = await _customerContext.Customers.FromSql("usp_CustomerAll_sel @SomeOutput out", votesParam).ToArrayAsync();
    return new Tuple<IEnumerable<Customer>, int>(y, **25**);
}
Run Code Online (Sandbox Code Playgroud)

结果就像

{"item1":[{"customerId":1,"customerName":"Cus1"},{"customerId":2,"customerName":"Cus2"}],"item2":27}
Run Code Online (Sandbox Code Playgroud)

基本上这就是我正在寻找的......有帮助吗?

Ako*_*agy 0

如果您熟悉 ADO.NET,下面是如何从存储过程获取多个结果集的示例:

从 C# 中的存储过程返回多个记录集

不过,在这种情况下,您必须放弃输出参数。