使用WebApi EntityFrameWorkCore 1.1的存储过程调用获取并且不是整数结果的对象

时间:2017-10-22 09:39:26

标签: sql-server stored-procedures asp.net-web-api asp.net-core

使用WebApi EntityFrameWorkCore 1.1进行存储过程调用获取并且对象不是整数结果

我有以下用户定义的过程从数据库调用带有2个参数的计算数据以返回一个整数(Count(*))

 USE [QIIS2]
 GO

 PROCEDURE [dbo].[sp.GetCansTotals] 
         @hospitalId int
 AS   
 BEGIN
     SET NOCOUNT ON;  

     SELECT COUNT(*) AS TotalCancelled
     FROM Cans
     WHERE hospitalId = @hospitalId;
END

调用该过程的存储库:

 public async Task GetCansTotals(int hospitalId)
        {
            using (appContext)
            {
                var hospitalid = new SqlParameter("@hospitalId", 1);
                var cans = appContext.Cans.FromSql("Exec GetCansTotals @hospitalId", hospitalId);
            }
        }

和控制器:

[HttpGet("byParams")]
        public IActionResult GetCanTotal(int hospitalId)
        {
            var res = _unitOfWork.Cans.GetCansTotals(hospitalId);
            return Ok(res);
        }

用邮递员传递请求时:

http://localhost:56963/api/cansdatas/byParams?hospitalId=2  我得到一个对象而不是COUNT(*)

的结果
{
    "result": {},
    "id": 1,
    "exception": null,
    "status": 5,
    "isCanceled": false,
    "isCompleted": true,
    "creationOptions": 0,
    "asyncState": null,
    "isFaulted": false
}

你能帮帮忙吗?

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。这是你可以做的 -

  1. 您正从存储过程返回标量值(count),并通过FromSql方法在DbSet上调用它。当存储过程返回映射到' Can'的属性的结果集时,应该使用此方法。类型(或者在DbSet中返回' Cans'属性的任何类型)。这不起作用。
  2. 似乎要执行返回标量值的存储过程,您仍然需要依赖于普通的ADO.NET。您可以在DbContext或存储库中添加扩展方法来执行此操作。请查看此答案以获取更多详细信息 - Entity Framework 7 FromSql stored procedure return value
  3. 您也可以在没有存储过程但使用LINQ的情况下返回计数。 同时将方法的返回类型更改为Task并使其为异步。

    public async Task<int> GetCansTotals(int hospitalId)
    {
        using (appContext)
        {
            return appContext.Cans.CountAsync(c => c.HospitalId == hospitalId);
        }
    }
    
  4. 考虑将控制器方法标记为异步,并使用await调用存储库方法。您还需要将控制器方法的返回类型更改为Task。

    [HttpGet("byParams")]
    public async Task<IActionResult> GetCanTotal(int hospitalId)
    {
        var res = await this._unitOfWork.GetCansTotals(hostpitalId);
        return Ok(res);
    }