Stored procedures 使用存储过程获取EF Core中的输出参数值,但不包含返回表数据

Stored procedures 使用存储过程获取EF Core中的输出参数值,但不包含返回表数据,stored-procedures,entity-framework-core,Stored Procedures,Entity Framework Core,我有一个存储过程,该存储过程应按id返回登录: CREATE PROCEDURE MyProcedure ( @id INT, @login NVARCHAR(50) OUTPUT ) AS BEGIN SELECT ID , Login FROM Users WHERE ID = @id END GO 在endpoint中,它可以与以下代码配合使用: var id

我有一个存储过程,该存储过程应按id返回登录:

CREATE PROCEDURE MyProcedure
(
    @id INT,
    @login NVARCHAR(50) OUTPUT
)
AS
BEGIN
    SELECT
            ID
        ,
            Login
FROM
    Users
WHERE
    ID = @id
END
GO
在endpoint中,它可以与以下代码配合使用:

            var id = new SqlParameter
            {
                ParameterName = "id",
                SqlDbType = SqlDbType.Int,
                Value = 15,
            };
            var login = new SqlParameter
            {
                ParameterName = "login",
                SqlDbType = SqlDbType.NVarChar,
                Direction = ParameterDirection.Output,
                Size = 50,
            };
            var query = $"EXEC MyProcedure @{id}, @{login} OUTPUT";
            var result = _context.Set<User>()
                .FromSqlRaw(query, id, login).ToList();
            foreach (var item in result) Console.WriteLine(item.Login);

和财产:

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>().HasNoKey();
        }
我收到一个错误
所需的列“Login”在“FromSql”操作的结果中不存在。


那么,获得
登录名的正确方法是什么呢?

解决此问题的简单方法是使用
context.Database.ExecuteSqlInterpolated()
context.Database.ExecuteSqlRaw()
而不是
context.Set().FromSqlRaw()

下面是一个完全工作的示例控制台程序,演示了该方法:

使用System.Collections.Generic;
使用系统数据;
使用系统诊断;
使用Microsoft.Data.SqlClient;
使用Microsoft.EntityFrameworkCore;
使用Microsoft.Extensions.Logging;
命名空间IssueConsoleTemplate
{
公共类用户
{
public int UserId{get;set;}
公共字符串登录{get;set;}
}
公共类上下文:DbContext
{
公共数据库集用户{get;set;}
配置时受保护的覆盖无效(DBContextOptions Builder Options Builder)
{
选项生成器
.UseSqlServer(
@“数据源=。\MSSQL14;集成安全性=SSPI;初始目录=So63991939”)
.UseLoggerFactory(LoggerFactory.Create(b=>b
.AddConsole()
.AddFilter(level=>level>=LogLevel.Information)))
.EnableSensitiveDataLogging()
.EnableDetailedErrors();
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasData(
新用户{UserId=1,Login=“John”},
新用户{UserId=2,Login=“Jane”});
}
}
内部静态类程序
{
私有静态void Main()
{
使用var context=newcontext();
context.Database.EnsureDeleted();
context.Database.recreated();
var connection=context.Database.GetDbConnection();
connection.Open();
使用(var command=connection.CreateCommand())
{
command.CommandText=@“创建过程uspGetUsers(
@userCount INT输出
)作为
开始
挑选
用户ID,
登录
从…起
用户;
选择@userCount=@@ROWCOUNT;
结束;“;
command.ExecuteNonQuery();
}
var userCountParameter=newsqlparameter(“@myUserCountParam”,SqlDbType.Int){Direction=ParameterDirection.Output};
context.Database.ExecuteSqlInterpolated($“EXEC uspGetUsers@userCount={userCountParameter}OUTPUT”);
Assert((int)userCountParameter.Value==2);
}
}
}
您可以使用以下命令运行示例代码

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>().HasNoKey();
        }
    SELECT
        @id = 
            ID
        ,
        @login = 
            Login