0

如何获取从 SQL Server 中的存储过程返回的 EF Core 中的 int 值?

--Two tables, Employee and AspNetUsers--
CREATE PROCEDURE SP_GetIdEmployeeByUserName
     (@username varchar(100), @idemployee int output)
AS
BEGIN
    SELECT @idemployee = (SELECT e.Id 
                          FROM Employee e
                          JOIN AspNetUsers a ON e.IdUser = a.Id
                          WHERE a.Email = @username)

END

--Executing in database--
DECLARE @idemp INT;
EXEC SP_GetIdEmployeeByUserName 'someinsertedemail@gmail.com', @idemp output
SELECT @idemp;

Employee.Id在 SQL Server 测试中返回正确

idemp `Id = 40`

现在在 Blazor(客户端)控制器中,我正在尝试执行存储过程。

[HttpGet]
[Route("getbyname")]
public int GetByName([FromQuery] string username)
{
        try
        {
            if (!string.IsNullOrEmpty(username))
            {
                SqlParameter paramUsername = new SqlParameter("@username", username);

                var paramOut = new SqlParameter
                {
                    ParameterName = "@idemp",
                    SqlDbType = System.Data.SqlDbType.Int,
                    Direction = System.Data.ParameterDirection.Output,
                };

                var result = _context
                    .Employee.FromSqlRaw
                    ($"EXEC SP_GetIdFuncByUserName @username, @idemp OUTPUT", paramUsername, paramOut)
                    .FirstOrDefault();

                Console.WriteLine("result = >>>>>>>>> " + result);

                return result.Id;
            }
            else
            {
                return 0;
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine("ex -> " + ex);
            throw;
        }
    }

我得到这个例外:

FromSqlRaw 或 FromSqlInterpolated 是使用不可组合的 SQL 调用的,并使用在其上构成的查询。
考虑AsEnumerable在 FromSqlRaw 或 FromSqlInterpolated 方法之后调用以在客户端执行组合。

如果尝试

var result = _context
                .Database.ExecuteSqlRaw
                ($"EXEC SP_GetIdFuncByUserName @username, @idemp OUTPUT", paramUsername, paramOut);

它总是返回-1,因为没有任何行受到影响。

我看到很多东西,但没有成功......提前谢谢

_context.Database.ExecuteSqlCommand if obsolete
4

1 回答 1

2

您有不可组合的 SQL。关键是实体框架会写出类似的东西

SELECT [Generated Column Names] FROM 
(
    @YOURQUERY
)

它这样做是为了确定能够实现(嵌套)结果、分页等的格式。

如果您不从存储过程中选择任何内容,它就无法编写此查询。无论如何它不会返回结果集,因此您也无法从dbContext.Employee. 那将是两个不同的查询。一个获取您已经拥有的 ID:

var result = _context
            .Database.ExecuteSqlRaw
            ($"EXEC SP_GetIdFuncByUserName @username, @count OUTPUT", paramUsername, paramOut);

这确实返回 -1,因为您的查询中有错误。您提供了一个名为的参数@count,但配置了一个名为 的参数@idemp

因此,请确保正确传递参数:

var result = _context
                .Database.ExecuteSqlRaw
                ($"EXEC SP_GetIdFuncByUserName @username, @idemp OUTPUT", paramUsername, paramOut);

然后使用 ID 参数查询:

var employeeId = paramOut.Value;
var employee = _context.Employee.FirstOrDefault(e => e.Id == employeeId);
于 2020-06-12T13:39:52.883 回答