C# 如何执行从EFCore返回单个值的存储过程?

C# 如何执行从EFCore返回单个值的存储过程?,c#,entity-framework-core,C#,Entity Framework Core,在我的应用程序中,我有三个insert存储过程,需要使用EF Core执行这些过程(这在ASP.NET Core Web API 3.1中) 以下是存储过程 spInsertPerson create proc spInsertPerson @FirstName VARCHAR(255), @Lastname VARCHAR(255) AS BEGIN INSERT INTO Person( FirstName, LastName ) VALUES ( @F

在我的应用程序中,我有三个insert存储过程,需要使用EF Core执行这些过程(这在ASP.NET Core Web API 3.1中)

以下是存储过程

spInsertPerson

create proc spInsertPerson
    @FirstName VARCHAR(255), 
    @Lastname VARCHAR(255)
AS 
BEGIN 
        INSERT INTO Person( FirstName, LastName ) VALUES ( @FirstName, @LastName )
        
        SELECT @@SCOPE_Identity() as NewId
END
spPublishData

CREATE PROC spspPublishData
    @Data VARBINARY(MAX),
    @scriptId int, 
    @sequanceId int OUTPUT
as
begin 

    INSERT INTO PubslishRegistry(  data, scriptRegisterid ) values (  @data , scriptId   )
    
    --some triiggers will fire and fill some tables along

    SELECT @sequanceId = FN_RANDOMIZED( CRC ) FROM [dbo].[hexa32pgr66] where scriptId = @scriptId

end
spBulkSaveContent

CREATE spBulkSaveContent
    @publisherId int
    @dtPublishersCollection PublisherType READONLY,  -- SQL user defined data type
    @dtStoresCollection StoresType READONLY
as
    begin 
    
            -- code written to save data 
    end
在Web API DBCOntext中

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
       //.....other entries here

        modelBuilder.Entity<Flag>().HasNoKey();

        // ....other entries here
    }
    
    
服务
类中,我创建了保存数据的方法

      public async Task<Int> Save(PersonDTO obj)
      {     
           string sqlQuery = $"exec spInsertPerson @FirstName, @Lastname";        
          
           var  flag = await this._context.Set<Flag>().FromSqlRaw<Flag>(sqlQuery,
                 new SqlParameter("@FirstName", obj.FirstName),
                  new SqlParameter("@Lastname", obj.LastName)                     
               ).FirstOrDefaultAsync();  

           return flag.NewId;
        }
公共异步任务保存(PersonDTO obj)
{     
字符串sqlQuery=$“exec spInsertPerson@FirstName,@Lastname”;
var flag=wait this.\u context.Set().FromSqlRaw(sqlQuery,
新的SqlParameter(“@FirstName”,obj.FirstName),
新的SqlParameter(“@Lastname”,obj.Lastname)
).FirstOrDefaultAsync();
return flag.NewId;
}
但我得到了这个错误:

使用不可组合的SQL调用了FromSqlRaw或FromSqlInterpolated,并在其上组合了一个查询

考虑在FromSqlRaw或FromSqlInterpolated方法之后调用AsEnumerable在客户端执行合成

如何解决这个问题,然后如何执行上面提到的三个存储过程并从我的服务中检索它们的数据


我这样做是否正确?

此代码试图将
IQueryable
(from
.FromSqlRaw
)转换为
DBSet
(from
.Set

      public async Task<Int> Save(PersonDTO obj)
      {     
           string sqlQuery = $"exec spInsertPerson @FirstName, @Lastname";        
          
           var  flag = await this._context.Set<Flag>().FromSqlRaw<Flag>(sqlQuery,
                 new SqlParameter("@FirstName", obj.FirstName),
                  new SqlParameter("@Lastname", obj.LastName)                     
               ).FirstOrDefaultAsync();  

           return flag.NewId;
        }
  public async Task<Int> Save(PersonDTO obj)
  {     
       string sqlQuery = $"exec spInsertPerson @FirstName, @Lastname";        
      
       var  flag = await this._context.Set<Flag>().FromSqlRaw<Flag>(sqlQuery,
             new SqlParameter("@FirstName", obj.FirstName),
              new SqlParameter("@Lastname", obj.LastName)                     
           ).FirstOrDefaultAsync();  

        return flag.NewId;
    }
  public async Task<Int> Save(PersonDTO obj)
  {     
       string sqlQuery = $"exec spInsertPerson @FirstName, @Lastname";        
      
       var  flag = await this._context.Set<Flag>().FromSqlRaw<Flag>(sqlQuery,
             new SqlParameter("@FirstName", obj.FirstName),
              new SqlParameter("@Lastname", obj.LastName)                     
           ).ToList().FirstOrDefaultAsync();  

        return flag.NewId;
    }