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

C# ASP.NET无需DTO获取动态SQL查询结果适配React动态模态框

无DTO的动态SQL查询与React模态框适配方案(ASP.NET + C#)

一、核心实现思路

无需DTO的动态查询,本质是让查询结果以动态类型/键值对集合形式返回,避免预先定义实体类。主流ORM(Dapper、EF Core)都支持这类场景,以下是具体实现:


二、Dapper 实现方案(推荐,轻量灵活)

Dapper原生支持返回dynamic类型,无需指定泛型DTO参数,直接映射SQL返回的所有字段:

1. 动态查询代码

using Dapper;

// 参数化查询,避免SQL注入
string query = @"SELECT * FROM People WHERE Id = @PersonId";
var dbConnection = _context.Connection.GetDatabase(); // 假设已获取Dapper数据库连接

// 直接调用Query,无需<T>泛型,返回IEnumerable<dynamic>
var dynamicResult = dbConnection.Query(query, new { PersonId = 123 }).FirstOrDefault();

2. 控制器返回逻辑

直接将动态结果序列化为JSON返回给前端,React可直接解析:

[HttpGet("person/{id}")]
public IActionResult GetPersonDynamic(int id)
{
    string query = @"SELECT * FROM People WHERE Id = @PersonId";
    var dbConnection = _context.Connection.GetDatabase();
    var result = dbConnection.Query(query, new { PersonId = id }).FirstOrDefault();
    
    if (result == null)
        return NotFound();
    
    return Ok(result);
}

三、EF Core 实现方案(适合已有EF上下文的场景)

EF Core 7+ 支持直接用SqlQuery<dynamic>执行原生SQL并返回动态结果,无需依赖实体类:

1. 动态查询代码

using Microsoft.EntityFrameworkCore;

// 参数化查询
var result = await _context.Database
    .SqlQuery<dynamic>("SELECT * FROM People WHERE Id = @Id", 
        new SqlParameter("@Id", 123))
    .FirstOrDefaultAsync();

2. 转成键值对集合(可选,更可控)

如果需要明确的键值对结构,可将动态对象转为Dictionary<string, object>:

using System.Dynamic;

var expando = (ExpandoObject)result;
var keyValuePairs = (IDictionary<string, object>)expando;

四、React动态模态框适配

后端返回的JSON是无固定结构的对象,前端可通过遍历键值对动态渲染内容,无需预先定义TS类型:

// 模态框组件示例
function PersonModal({ personData, onClose }) {
    if (!personData) return null;
    
    return (
        <div className="modal">
            <button onClick={onClose}>关闭</button>
            <div className="modal-content">
                {Object.keys(personData).map((key) => (
                    <div key={key} className="data-row">
                        <label>{key}:</label>
                        <span>{personData[key]}</span>
                    </div>
                ))}
            </div>
        </div>
    );
}

关键注意事项

  • 必须使用参数化查询:禁止直接拼接SQL字符串,防止SQL注入攻击。
  • 动态类型仅在运行时可用,编译期无类型检查,需确保SQL返回字段的合法性。
  • 若需跨层传递,建议转为Dictionary<string, object>而非dynamic,避免序列化问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 15:07:16