【发布时间】:2020-06-12 12:49:19
【问题描述】:
如何在 EF Core 中获取从 SQL Server 中的存储过程返回的 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;
在 SQL Server 测试中返回正确的 Employee.Id
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 调用的,并且在其上进行了查询。
考虑在 FromSqlRaw 或 FromSqlInterpolated 方法之后调用AsEnumerable在客户端执行合成。
如果尝试
var result = _context
.Database.ExecuteSqlRaw
($"EXEC SP_GetIdFuncByUserName @username, @idemp OUTPUT", paramUsername, paramOut);
它总是返回 -1,因为没有行受到影响。
我看到了很多东西,但没有成功...提前谢谢
_context.Database.ExecuteSqlCommand if obsolete
- https://docs.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/breaking-changes#linq-queries-are-no-longer-evaluated-on-the-client
- https://github.com/dotnet/efcore/issues/17558
- Include with FromSqlRaw and stored procedure in EF Core 3.1
- How to call a stored procedure in EF Core 3.0 via FromSqlRaw
- EF core 3.1 can not run complex raw sql query
- https://www.sqlservertutorial.net/sql-server-stored-procedures/stored-procedure-output-parameters/
【问题讨论】:
-
你试过`FromSqlRaw吗?
-
附注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实冒着将来某个时候名字冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀!
标签: c# sql-server entity-framework stored-procedures asp.net-blazor