C# 列映射到未命名列

C# 列映射到未命名列,c#,asp.net-core,entity-framework-core,asp.net-core-3.1,entity-framework-core-3.1,C#,Asp.net Core,Entity Framework Core,Asp.net Core 3.1,Entity Framework Core 3.1,我正在使用EntityFrameworkCore3来尝试执行一个存储过程。我需要获取存储过程的返回值,但是,在存储过程中,没有名称。以下是执行存储过程的代码: var data = await _context.Set<ArfmCreateEditRequestDto>() .FromSqlRaw(@"ARFMCreateEditRequest {0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12

我正在使用EntityFrameworkCore3来尝试执行一个存储过程。我需要获取存储过程的返回值,但是,在存储过程中,没有名称。以下是执行存储过程的代码:

var data = await _context.Set<ArfmCreateEditRequestDto>()
            .FromSqlRaw(@"ARFMCreateEditRequest {0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},{17},{18},{19},{20},{21},{22},{23},{24},{25}", 
                "Add", accountType, srIdentifier, srCheckDigit, arIdentifier, arCheckDigit, customerName, changeCustomerName, 
                supplierId, amount, paymentMethod, addressType, address1, address2, address3, address4, country, city,
                state, zip, statusCode, createdBy, invoiceDate, approvedBy, comments, updateId).ToListAsync();
在SQL Server上执行此操作时,会得到以下结果:

--------------------------------------
| (No column name)                   |
--------------------------------------
| RequestID: 36 Succesfully Added    |
--------------------------------------
当我运行我的程序时,我得到一个异常

System.InvalidOperationException:“FromSql”操作的结果中不存在所需的列“Retval”

如果我将其更改为:

    [Column("", Order = 0)]
    public string Retval { get; set; }
然后我得到一个例外:

System.ArgumentException:参数“name”不能为null、空或仅包含空格。参数“name”

我真的认为第一件事会起作用,实体框架会将数据从订单位置0映射到我的属性,但显然没有


所以我的问题是,如果存储过程中的列未命名,如何捕获我的返回值?注意,我根本无法更改存储过程。

这是不可能的。使用SQLRAW时存在一些限制

1-SQL查询必须返回实体类型的所有属性的数据

2-结果集中的列名必须与属性映射到的列名匹配。注意,此行为与EF6不同。EF6忽略了原始SQL查询的属性到列映射,结果集列名必须与属性名匹配

基于此链接:

但我认为您可以将存储过程包装起来,并使用如下任意列将结果插入临时表:

var data = await _context.Set<ArfmCreateEditRequestDto>()
            .FromSqlRaw(@"create table #tmp( Retval nvarchar(128) ) insert into #tmp( Retval ) exec ARFMCreateEditRequest {0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},{17},{18},{19},{20},{21},{22},{23},{24},{25} select Retval from #tmp", 
                "Add", accountType, srIdentifier, srCheckDigit, arIdentifier, arCheckDigit, customerName, changeCustomerName, 
                supplierId, amount, paymentMethod, addressType, address1, address2, address3, address4, country, city,
                state, zip, statusCode, createdBy, invoiceDate, approvedBy, comments, updateId).ToListAsync();

ArfmCreateEditRequestDto看起来像什么?该存储过程的响应是什么?存储过程是否返回任何值?您可以共享存储过程的相关代码吗?@DavidG-我在问题中向ArfmCreateEditRequestDto发布了代码,在问题中向我的存储过程发布了响应。@ChetanRanpariya-我在问题中向我的存储过程发布了响应。它只返回一个未命名的varchar列。
var data = await _context.Set<ArfmCreateEditRequestDto>()
            .FromSqlRaw(@"create table #tmp( Retval nvarchar(128) ) insert into #tmp( Retval ) exec ARFMCreateEditRequest {0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},{17},{18},{19},{20},{21},{22},{23},{24},{25} select Retval from #tmp", 
                "Add", accountType, srIdentifier, srCheckDigit, arIdentifier, arCheckDigit, customerName, changeCustomerName, 
                supplierId, amount, paymentMethod, addressType, address1, address2, address3, address4, country, city,
                state, zip, statusCode, createdBy, invoiceDate, approvedBy, comments, updateId).ToListAsync();