【问题标题】:Execute stored procedure in EF Core returning int from JOIN. blazor(client-side)在 EF Core 中执行存储过程,从 JOIN 返回 int。 blazor(客户端)
【发布时间】: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

【问题讨论】:

标签: c# sql-server entity-framework stored-procedures asp.net-blazor


【解决方案1】:

您有不可组合的 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);

【讨论】:

  • 你是对的。 @count 只是复制/粘贴错误。参数输出值;救救我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 2020-03-23
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 2015-04-14
相关资源
最近更新 更多