You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7中使用FromSqlRaw调用存储过程无法返回目标JSON格式

.NET 7 调用存储过程返回指定JSON格式的解决方法

问题核心

当前控制器直接返回OutputString集合,得到的JSON是数组结构,但需求是外层包含Account字段的对象结构;同时原代码用字符串拼接参数存在SQL注入风险,这两个问题需要同时解决。

解决步骤

1. 修正存储过程调用的参数传递(避免SQL注入)

原代码直接拼接参数的方式存在安全隐患,改用EF Core的参数化查询:

public async Task<ActionResult<AccountResponse>> Getoutput(AccountByCustomer input)
{
    // 使用参数占位符,避免SQL注入
    var storedProc = "exec dbo.Get_ACCOUNT_Data_To_API @CustomerNumber, @RequestClass, @EmailAddress, @TransactionId";
    
    // 执行存储过程并获取数据
    var accountList = await _context.OutputString
        .FromSqlRaw(storedProc, 
            input.CustomerNumber, 
            input.RequestClass, 
            input.EmailAddress, 
            input.TransactionId)
        .ToListAsync();

2. 定义返回结构的包装类

为了得到期望的JSON格式,需要创建一个包含Account数组的包装类:

public class AccountResponse
{
    public List<OutputString> Account { get; set; }
}

如果OutputString的属性名和JSON里的字段不匹配(比如类里是CustomerNumber但JSON需要CustomerNo),可以用JsonPropertyName特性做映射:

using System.Text.Json.Serialization;

public class OutputString
{
    [JsonPropertyName("Token")]
    public string Token { get; set; }

    [JsonPropertyName("CustomerNo")]
    public string CustomerNumber { get; set; }
}

3. 包装数据并返回

将查询到的OutputString集合包装到AccountResponse中,返回给客户端:

// 包装成指定的结构
    var response = new AccountResponse
    {
        Account = accountList
    };

    return Ok(response);
}

4. 验证存储过程返回字段

确保存储过程返回的字段名称和OutputString类的属性(或映射后的名称)一致,否则会出现字段值为空的情况。如果存储过程返回的字段名不同,可以在存储过程中用别名调整,比如:

SELECT Token, CustomerNumber AS CustomerNo FROM ...

这样处理后,接口返回的JSON就会和期望的结构一致:

{
    "Account": [
        {
            "Token": "8026F271-34FB-47F9-A465-83E9B0EF99FD",
            "CustomerNo": "..."
        }
    ]
}

内容的提问来源于stack exchange,提问作者user2660603

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 11:30:50