Как я могу получить значение int в EF Core, возвращенное из хранимой процедуры в SQL Server?
--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 '[email protected]', @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
- 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
- Включить с FromSqlRaw и хранимой процедурой в EF Core 3.1
- Как вызвать хранимую процедуру в EF Core 3.0 через FromSqlRaw
- EF core 3.1 не может выполнять сложный необработанный запрос sql
- https://www.sqlservertutorial.net/sql-server-stored-procedures/stored-procedure-output-parameters/
sp_
для ваших хранимых процедур. Microsoft зарезервировала этот префикс для собственного использования ( см. Именование хранимых процедур), и вы действительно рискуете столкнуться с конфликтом имен когда-нибудь в будущем. Это также плохо сказывается на производительности хранимых процедур. Лучше просто избегатьsp_
и использовать что-то еще в качестве префикса - или вообще не использовать префикс! - person marc_s   schedule 12.06.2020